如何修复双重编码的UTF8字符(在utf-8表中)

之前的LOAD DATA INFILE是在假定CSV文件是latin1编码的情况下运行的。 在此导入期间,多字节字符被解释为两个单字符,然后使用utf-8(再次)进行编码。

这种双重编码造成的exception像ñ而不是ñ

如何纠正这些string?

以下MySQL函数将在双重编码后返回正确的utf8string:

 CONVERT(CAST(CONVERT(field USING latin1) AS BINARY) USING utf8) 

它可以与UPDATE语句一起使用来更正字段:

 UPDATE tablename SET field = CONVERT(CAST(CONVERT(field USING latin1) AS BINARY) USING utf8); 

上面的答案适用于我的一些数据,但运行后导致了很多NULL列。 我的想法是,如果转换不成功,则返回null。 为了避免这一点,我添加了一个小检查。

 UPDATE tbl SET col = CASE WHEN CONVERT(CAST(CONVERT(col USING latin1) AS BINARY) USING utf8) IS NULL THEN col ELSE CONVERT(CAST(CONVERT(col USING latin1) AS BINARY) USING utf8) END