插入错误的编码后更新MySQL数据库中的数据

时间:2015-06-30 10:00:51

标签: php mysql database utf-8

我使用PHP和MySQL来保存阿拉伯数据。

我的数据库整理是:utf8_general_ci

我的数据库字符集是:utf8

起初我没有在插入之前使用SET NAMES utf8,因此数据以奇怪的字符插入数据库中,但在我的应用程序中正确显示。使用SET NAMES utf8后,数据会正确插入,但即使在我的应用程序中,旧数据也不会以阿拉伯字符显示(新数据正常)。

如何更新我的应用程序和MySQL数据库中用阿拉伯字母显示的所有数据?

更新

当我使用mb_detect_encoding函数检查两个字符串(插入的字符串和我要转换的字符串)的编码时,我得到两个字符串都是UTF-8。

以下是两个字符串的示例:

插入的文字:الإسم بالعربية 我需要转换为الإسم بالعربية

的文字

2 个答案:

答案 0 :(得分:3)

您遭受“双重编码”。

发生了什么事。

  • 客户端的字符编码为utf8;和
  • SET NAMES latin1声称客户端有latin1编码;和
  • 表格中的列声明为CHARACTER SET utf8

让我们来看看e-acute发生的事情:é

  1. 在utf8中的十六进制是2个字节:C3A9
  2. SET NAMES latin1将其视为2个latin1编码的字符 é(hex:C3A9)< / LI>
  3. 由于目标是CHARACTER SET utf8,因此需要转换这2个字符。 Ã已转换为utf8(十六进制C383)和©(十六进制C2A9
  4. 因此,存储了4个字节(十六进制C383C2A9
  5. 当读回来时,执行了相反的步骤, 并且最终用户可能注意到没有错。出了什么问题:

    • 存储的数据是应有的2倍(亚洲语言的3倍)。
    • 等于,大于等的比较可能无法按预期工作。
    • ORDER BY可能无法按预期工作。

    这样的事情会修复你的数据:

    UPDATE ... SET col = CONVERT(BINARY(CONVERT(
                             CONVERT(UNHEX(col) USING utf8)
                             USING latin1)) USING utf8);
    

    More discussionMore examples of fixing it

答案 1 :(得分:0)

也许这有用[http://forums.mysql.com/read.php?103,209072,209072

* MySQL论坛上的相同错误和解决方案。 (自2008年起)