之前的LOAD DATA INFILE
是在假设CSV文件为latin1
编码的情况下运行的。在此导入期间,多字节字符被解释为两个单个字符,然后使用utf-8进行编码(再次)。
此双重编码会导致ñ
而非ñ
等异常。
如何更正这些字符串?
答案 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);
请注意这一点。