我正在尝试清理继承的表。有一个文本列,其中包含英语以外的其他语言的文本,通常该文本看起来像这样:Phé©nix
我知道这应该是法语单词:phénix
所以我猜ƒ将会是字母é的编码失败
有谁知道为什么会这样,并且有什么办法可以解决?相同的编码错误不断弹出,所以对于这些编码错误,是否存在与字母等效的东西,可以用来与正确的字符进行匹配?
谢谢
最佳答案
CONVERT(BINARY(CONVERT(CONVERT(BINARY(CONVERT('é' USING latin1)) USING utf8) USING latin1)) USING utf8)
--> 'é'
您有双重编码。
这可能是发生了什么。
客户端的字符编码为utf8(良好);和
SET NAMES latin1
谎称客户使用了latin1编码;和表中的列声明为
CHARACTER SET utf8
(良好)。让我们逐步了解电子急性发作:
é
。在utf8中,十六进制为2个字节:
C3A9
。SET NAMES latin1
将其视为2个由拉丁语编码的字符Ã
和©
(十六进制:C3
和A9
)由于目标是
CHARACTER SET utf8
,因此需要转换这2个字符。Ã
转换为utf8(十六进制C383
)和©
(十六进制C2A9
)因此,存储了4个字节(
C383C2A9
的十六进制é
)读回时,执行了相反的步骤,
最终用户可能没有发现任何错误。怎么了:
存储的数据是其应有数据的2倍(亚洲语言为3倍)。
相等,大于等的比较可能无法按预期进行。
ORDER BY
可能无法正常工作。修复(2个部分):
确保执行
SET NAMES utf8;
(或等效项,例如mysqli_set_charset('utf8')
)。这样的事情将修复您的数据:
UPDATE ... SET col = CONVERT(BINARY(CONVERT( CONVERT(UNHEX(col) USING utf8) USING latin1)) USING utf8);
关于mysql - MySQL数据库文本编码错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31923529/