我们有一个使用latin1_swedish_ci字段的MySQL表,但是其中有一些UTF-8编码的数据。

当我将排序规则从latin1_swedish_ci更改为utf8_general_ci时,它可以很好地转换ISO-8859-1的内容,但是UTF-8数据却被破坏了,看到的东西就像是……。

有任何想法吗?

编辑:我们在MySQL 5.1中使用InnoDB

最佳答案

因此,您的“ latin1”列具有一些以UTF-8编码的数据,但不是全部,现在您有一些以UTF-8双重编码的数据?

您可以执行以下操作来修复双重编码的值:首先转换回latin1,将字符串重新解释为二进制,然后告诉MySQL二进制字符串实际上是UTF-8编码的文本。在MySQL中,可以这样写:

convert(binary convert(mycolumn using latin1) using utf8)


现在的问题是检测哪些字符串是双重编码的,以便您只能更新那些字符串。这可以通过将原始字符串的长度(以字符为单位)与新字符串的长度(以字节为单位)进行比较来完成;对于双重编码的文本,它们应该相等。这就是最终的结果:

update mytable set mycolumn = @str where char_length(mycolumn) =
    length(@str := convert(binary convert(mycolumn using latin1) using utf8));

关于mysql - 更改排序规则时,UTF8编码的文本被错误地更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11761936/

10-11 17:07