我们有一个MySQL表,其字段使用latin1_swedish_ci
但是那里有一些UTF-8编码数据。
当我将排序从latin1_swedish_ci
更改为utf8_general_ci
时,它可以很好地转换ISO-8859-1的内容,但是UTF-8数据会被破坏,看起来像......你需要
有什么想法吗?
编辑:我们正在使用带有MySQL 5.1的InnoDB
答案 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));