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

Updating data in MySQL database after inserting in the wrong encoding

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

我的数据库排序规则是:utf8_general_ci

我的数据库字符集是:utf8

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

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

更新

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

下面是两个字符串的例子:

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

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

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

您患有 "double encoding".

事情是这样的。

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

让我们来看看 e-acute 发生了什么:é

  1. 十六进制,在 utf8 中是 2 个字节:C3A9.
  2. SET NAMES latin1 将其视为 2 个 latin1 编码的 字符 é(十六进制:C3A9)
  3. 由于目标是CHARACTER SET utf8,这2个字符需要转换。 Ã 被转换为 utf8(十六进制 C383)和 ©(十六进制 C2A9
  4. 因此,存储了 4 个字节(十六进制 C383C2A9

读回时,执行了相反的步骤, 最终用户可能没有注意到任何错误。出了什么问题:

  • 存储的数据是应有数据的 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