我正在尝试清理继承的表。有一个文本列,其中包含英语以外的其他语言的文本,通常该文本看起来像这样: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个由拉丁语编码的字符é(十六进制:C3A9
由于目标是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/

10-12 12:30
查看更多