MySQL数据库文本编码错误

时间:2015-08-10 15:28:53

标签: mysql database encoding

我正在尝试清理我继承的表。有一个文本列,其中包含非英语语言的文本,文本通常看起来像这样:Phé©nix

我知道它应该是法语单词:phénix

所以我猜郩将成为字母é

的编码失败

有谁知道为什么会发生这种情况,有没有办法解决这个问题?弹出相同的编码错误,所以是否有类似于这些编码错误的字母表,我可以使用它来匹配正确的字符?

谢谢

1 个答案:

答案 0 :(得分:0)

CONVERT(BINARY(CONVERT(CONVERT(BINARY(CONVERT('é' USING latin1)) USING utf8) USING latin1)) USING utf8)
-->  'é'

您有双重编码

这可能发生了什么。

  • 客户端的字符编码为utf8(好);和
  • SET NAMES latin1声称客户端有latin1编码;和
  • 表中的列声明CHARACTER SET utf8(好)。

让我们来看看e-acute发生的事情:é

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

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

    • 存储的数据是应有的2倍(亚洲语言的3倍)。
    • 等于,大于等的比较可能无法按预期工作。
    • ORDER BY可能无法按预期工作。

    修复(2部分):

    1. 请务必SET NAMES utf8;(或同等内容,例如mysqli_set_charset('utf8'))。

    2. 这样的事情会修复您的数据:

      UPDATE ... SET col = CONVERT(BINARY(CONVERT( CONVERT(UNHEX(col) USING utf8) USING latin1)) USING utf8);