我正在尝试清理我继承的表。有一个文本列,其中包含非英语语言的文本,文本通常看起来像这样:Phé©nix
我知道它应该是法语单词:phénix
所以我猜郩将成为字母é
的编码失败有谁知道为什么会发生这种情况,有没有办法解决这个问题?弹出相同的编码错误,所以是否有类似于这些编码错误的字母表,我可以使用它来匹配正确的字符?
谢谢
答案 0 :(得分:0)
CONVERT(BINARY(CONVERT(CONVERT(BINARY(CONVERT('é' USING latin1)) USING utf8) USING latin1)) USING utf8)
--> 'é'
您有双重编码。
这可能发生了什么。
SET NAMES latin1
声称客户端有latin1编码;和CHARACTER SET utf8
(好)。让我们来看看e-acute发生的事情:é
。
C3A9
。SET NAMES latin1
将其视为2个latin1编码的字符 Ã
和©
(hex:C3
和A9
)< / LI>
CHARACTER SET utf8
,因此需要转换这2个字符。
Ã
已转换为utf8(十六进制C383
)和©
(十六进制C2A9
)C383C2A9
)é
醇>
当读回来时,执行了相反的步骤, 并且最终用户可能注意到没有错。出了什么问题:
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);