web-dev-qa-db-fra.com

Comment réparer les caractères UTF8 à double codage (dans un tableau utf-8)

Un précédent LOAD DATA INFILE a été exécuté en supposant que le fichier CSV est latin1- codé. Au cours de cette importation, les caractères multi-octets ont été interprétés comme deux caractères simples, puis encodés à l'aide de utf-8 (à nouveau).

Ce double encodage a créé des anomalies comme ñ au lieu de ñ.

Comment corriger ces chaînes?

51
vbence

La fonction MySQL suivante renverra la chaîne utf8 correcte après un double encodage:

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

Il peut être utilisé avec une instruction UPDATE pour corriger les champs:

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

La réponse ci-dessus a fonctionné pour certaines de mes données, mais a entraîné de nombreuses colonnes NULL après l'exécution. Ma pensée est que si la conversion n'a pas réussi, elle renvoie null. Pour éviter cela, j'ai ajouté un petit chèque.

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