MySQL utf-8 问题与 json

Posted

技术标签:

【中文标题】MySQL utf-8 问题与 json【英文标题】:MySQL utf-8 issue with json 【发布时间】:2017-03-07 12:07:44 【问题描述】:

我们使用myOdbc 连接器将我们的asp 页面连接到数据库,我们的数据库很旧,我们有大约包含用户记录的大表。 500k 行。一切都是utf8 并且运行良好。在 mysql / phpmyadmin 记录显示为 ansii 字符。例如ελληνικά 是单词,但我们在数据库中看到ελληνικά。但是前端一切正常。

现在我们决定创建restful java webservices,前端使用angular/bootstrap。一切似乎都很好,所有 utf 设置都已完成,但是当我们 post/get 时,我们收到的字符串就像它们在 mysql 表中一样;对于这个样本,我们得到ελληνικά,而不是ελληνικά。

在同一台服务器上,我检查了另一个项目,它是 utf,我添加了一些单词,但我看到 phpymadmin 用普通字母显示它们。如果我发布/插入 ελληνικά ,它是表和 phpmyadmin 中的 ελληνικά 。

我应该怎么做,处理这个问题的正确方法是什么? 如果我在 phpmyadmin 中手动插入 ελληνικά,旧网站会显示 ?。 哪种方法最好且正确? 我必须将所有数据更改为普通字母,我该怎么做? mysql 可以处理这个吗?

提前致谢

【问题讨论】:

您的前端 ASP 应用程序似乎没有正确存储它们。您确定它们以 UTF-8 格式存储吗? 当我们第一次创建它时,它是 mysql 4,我记得 mysql 在给定的例子中保留了 utf-8。如果 ASP 没有正确存储它们,它会成功将不正确的数据显示为正确的数据,因为即使现在它工作得很好,但我们必须移动数据。谢谢 Mysql 对 UTF-8 的设置并没有说明可以推送哪些数据。如果你存储乱码,你会得到乱码。到目前为止,你的运气是阅读和写作是在同一个应用程序中进行的 :) 那么我认为一种方法是使用该应用程序生成 sql 备份文件,您怎么看?问题可能是我阅读但不确定的双重编码,我相信有些人遇到了同样的问题。 我不确定什么是最好的方法。如果您能找到一种方法将其翻译为正确的字母并将该转换器用于新的 restful 项目,那么您实际上甚至可能不需要修复 DB。 【参考方案1】:

整个过程可以分为两部分

1) 需要更新历史数据

获取受影响的行数

SELECT COUNT(*) FROM `users` t WHERE  t.`fullname`  <> CONVERT(t.`fullname` USING ASCII);

需要更新受影响的行

UPDATE `users` t SET t.`fullname`= REPLACE(REPLACE(REPLACE(REPLACE(t.`fullname`,'Ã',''),'Â',''),'¢',''),'â','') WHERE  t.`fullname`  <> CONVERT(t.`fullname` USING ASCII);

2) 现在可以以可读格式获取后续数据,为此您需要使用以下查询修改代码

SELECT  CONVERT(BINARY CONVERT(t.`fullname` USING latin1) USING utf8) FROM `internal_trainingclassmaster` t  WHERE  t.`users`  <> CONVERT(t.`fullname` USING ASCII);

【讨论】:

【参考方案2】:

UPDATE users SET fullname= convert(cast(convert(fullname using latin1) as binary) using utf8) WHERE id>0;

这是解决方案,脚本在存储数据之前将 utf8 转换为 latin1,反之亦然。

命令适用于所有语言。感谢 cmets。

【讨论】:

更多情况:mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases

以上是关于MySQL utf-8 问题与 json的主要内容,如果未能解决你的问题,请参考以下文章

Android JSON CharSet UTF-8问题

Android JSON CharSet UTF-8 问题

如何在 PHP:json_encode 中使用 UTF-8

Ruby to_json 出现错误“非法/格式错误的 utf-8”问题

Android 使用JSON格式与服务器交互 中文乱码问题解决

在节点 MySQL 与 JSON 上