2012-08-01 40 views
0

我们有一个MySQL表,其中的字段使用latin1_swedish_ci,但是在那里有一些UTF-8编码数据。UTF8编码的文本在更改排序规则时被错误地更改

当我将排序规则从latin1_swedish_ci更改为utf8_general_ci时,它会转换ISO-8859-1的东西,但UTF-8数据被破坏,看到像......的东西。

任何想法?

编辑:我们正使用InnoDB与MySQL 5.1

回答

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));