web-dev-qa-db-ja.com

二重エンコードされたUTF8文字を修正する方法(utf-8テーブル内)

前のLOAD DATA INFILEは、CSVファイルがlatin1- encoded。このインポート中に、マルチバイト文字は2つの単一文字として解釈され、utf-8を使用してエンコードされます(再び)。

この二重エンコードにより、ñ の代わりに ñ

これらの文字列を修正するには?

51
vbence

次の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);
101
vbence

上記の回答は私のデータの一部で機能しましたが、実行後に多くの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
13
Eric