插入错误编码后更新 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 发生了什么:é
。
- 十六进制,在 utf8 中是 2 个字节:
C3A9
.
SET NAMES latin1
将其视为 2 个 latin1 编码的 字符 Ã
和 ©
(十六进制:C3
和 A9
)
- 由于目标是
CHARACTER SET utf8
,这2个字符需要转换。
Ã
被转换为 utf8(十六进制 C383
)和 ©
(十六进制 C2A9
)
- 因此,存储了 4 个字节(十六进制
C383C2A9
)
读回时,执行了相反的步骤,
最终用户可能没有注意到任何错误。出了什么问题:
- 存储的数据是应有数据的 2 倍(亚洲语言为 3 倍)。
- 等于、大于等的比较可能无法按预期工作。
ORDER BY
可能无法按预期工作。
类似这样的操作将修复您的数据:
UPDATE ... SET col = CONVERT(BINARY(CONVERT(
CONVERT(UNHEX(col) USING utf8)
USING latin1)) USING utf8);
我正在使用 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 发生了什么:é
。
- 十六进制,在 utf8 中是 2 个字节:
C3A9
. SET NAMES latin1
将其视为 2 个 latin1 编码的 字符Ã
和©
(十六进制:C3
和A9
)- 由于目标是
CHARACTER SET utf8
,这2个字符需要转换。Ã
被转换为 utf8(十六进制C383
)和©
(十六进制C2A9
) - 因此,存储了 4 个字节(十六进制
C383C2A9
)
读回时,执行了相反的步骤, 最终用户可能没有注意到任何错误。出了什么问题:
- 存储的数据是应有数据的 2 倍(亚洲语言为 3 倍)。
- 等于、大于等的比较可能无法按预期工作。
ORDER BY
可能无法按预期工作。
类似这样的操作将修复您的数据:
UPDATE ... SET col = CONVERT(BINARY(CONVERT(
CONVERT(UNHEX(col) USING utf8)
USING latin1)) USING utf8);