我们有一个带有字段的 MySQL 表,latin1_swedish_ci
但是那里有一些 UTF-8 编码的数据。
当我将排序规则从 更改为 时latin1_swedish_ci
,utf8_general_ci
它可以很好地转换 ISO-8859-1 的内容,但是 UTF-8 数据会被破坏,看到类似......你的东西。
有任何想法吗?
编辑:我们将 InnoDB 与 MySQL 5.1 一起使用
我们有一个带有字段的 MySQL 表,latin1_swedish_ci
但是那里有一些 UTF-8 编码的数据。
当我将排序规则从 更改为 时latin1_swedish_ci
,utf8_general_ci
它可以很好地转换 ISO-8859-1 的内容,但是 UTF-8 数据会被破坏,看到类似......你的东西。
有任何想法吗?
编辑:我们将 InnoDB 与 MySQL 5.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));