更改排序规则时,UTF8编码的文本未正确更改

时间:2012-08-01 14:55:38

标签: mysql utf-8 character-encoding collation

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

当我将排序从latin1_swedish_ci更改为utf8_general_ci时,它可以很好地转换ISO-8859-1的内容,但是UTF-8数据会被破坏,看起来像......你需要

有什么想法吗?

编辑:我们正在使用带有MySQL 5.1的InnoDB

1 个答案:

答案 0 :(得分:1)

所以,你的“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));