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

vbe*_*nce 52 mysql string utf-8 character-encoding

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

这种双重编码创造了异常,ñ而不是ñ.

如何纠正这些字符串?

vbe*_*nce 102

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

CONVERT(CAST(CONVERT(field USING latin1) AS BINARY) USING utf8)
Run Code Online (Sandbox Code Playgroud)

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

UPDATE tablename SET
    field = CONVERT(CAST(CONVERT(field USING latin1) AS BINARY) USING utf8);
Run Code Online (Sandbox Code Playgroud)

  • 我不能不说我有多开心我找到了这个解决方案:) (7认同)

小智 13

上面的答案适用于我的一些数据,但在运行后产生了很多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
Run Code Online (Sandbox Code Playgroud)

  • 救了我!完美的!!谢谢! (2认同)
  • 防止数据丢失的一个非常重要的补充,谢谢!您可以通过将“CASE WHEN Converted IS NULL THEN original ELSE Con​​verted END”替换为“IF(converted IS NULL, original, Converted)”甚至“IFNULL(converted, original)”来进一步简化。 (2认同)

小智 5

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

UPDATE tablename SET
field = CONVERT(CAST(CONVERT(field USING latin1) AS BINARY) USING utf8mb4);
Run Code Online (Sandbox Code Playgroud)

对此要小心。