Mysql
 sql >> Base de données >  >> RDS >> Mysql

Les chaînes UTF-8 dans une base de données MySQL ont été gâchées après un changement de configuration

C3 83 C6 92 C3 82 C2 AA
C3 3F C2 AA

C'est ce que vous obtenez si vous traitez la séquence d'octets comme UTF-8, puis l'encodez comme ISO-8859-1. 3F est ? , qui a été inclus comme caractère de remplacement, car UTF-8 C6 92 est U+0192 ƒ qui n'existe pas dans l'ISO-8859-1. Mais il existe dans la page de codes Windows 1252 Western European, un codage très similaire à ISO-8859-1; là, c'est l'octet 0x83.

C3 83 C2 AA

Passez par une autre série de traiter-comme-UTF-8-octets-et-encoder-vers-cp1252 et vous obtenez :

C3 AA

qui est, enfin, UTF-8 pour ê .

Notez que même si vous servez explicitement une page HTML non-XML en tant qu'ISO-8859-1, les navigateurs utiliseront en fait l'encodage cp1252, pour de mauvaises raisons historiques.

Malheureusement MySQL n'a pas d'encodage cp1252; latin1 est (correctement) ISO-8859-1. Vous ne pourrez donc pas réparer les données en vidant en latin1 puis en rechargeant en utf8 (deux fois). Vous devrez traiter le script avec un éditeur de texte qui peut enregistrer soit (ou par exemple en Python file(path, 'rb').read().decode('utf-8').encode('cp1252').decode('utf-8').encode('cp1252') ).