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

时间:2012-07-11 15:54:18

标签: mysql string utf-8 character-encoding

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

此双重编码会导致ñ而非ñ等异常。

如何更正这些字符串?

4 个答案:

答案 0 :(得分:99)

以下MySQL函数将在双重编码后返回正确的utf8字符串:

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

答案 1 :(得分:12)

上面的答案适用于我的一些数据,但在运行后导致了很多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

答案 2 :(得分:2)

我也遇到了这个问题,这是针对Oracle的解决方案:

update tablename t set t.colname = convert(t.colname, 'WE8ISO8859P1', 'UTF8') where t.colname like '%Ã%'

还有一个Java版本:

public static String fixDoubleEncoded(String text) {
    final Pattern pattern = Pattern.compile("^.*Ã[^0-9a-zA-Z\\ \t].*$");
    try {
        while (pattern.matcher(text).matches())
            text = new String(text.getBytes("iso-8859-1"), "utf-8");
    }
    catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return text;
}

答案 3 :(得分:1)

好吧,使用“ utf8mb4”而不是“ utf8”非常重要,因为mysql会在无法识别的字符后去除所有数据。所以更安全的方法是;

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

请注意这一点。