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

Mise à jour des données dans la base de données MySQL après avoir inséré le mauvais encodage

Vous souffrez de "double encodage".

Voici ce qui s'est passé.

  • Le client avait des caractères encodés en utf8 ; et
  • SET NAMES latin1 a menti en prétendant que le client avait un encodage latin1 ; et
  • La colonne de la table déclarée CHARACTER SET utf8 .

Passons en revue ce qui arrive à e-acute :é .

  1. L'hexadécimal pour cela, en utf8 est de 2 octets :C3A9 .
  2. SET NAMES latin1 l'a vu comme 2 caractères encodés en latin1 Ã et © (hexadécimal :C3 et A9 )
  3. Puisque la cible était CHARACTER SET utf8 , ces 2 caractères devaient être convertis.Ã a été converti en utf8 (hex C383 ) et © (hexadécimal C2A9 )
  4. Donc, 4 octets ont été stockés (hex C383C2A9 )

Lors de la relecture, les étapes inverses ont été effectuées et l'utilisateur final n'a peut-être rien remarqué d'anormal. Qu'est-ce qui ne va pas :

  • Les données stockées sont 2 fois plus volumineuses qu'elles ne le devraient (3 x pour les langues asiatiques).
  • Les comparaisons pour égal, supérieur à, etc. peuvent ne pas fonctionner comme prévu.
  • ORDER BY peut ne pas fonctionner comme prévu.

Quelque chose comme ceci réparera vos données :

UPDATE ... SET col = CONVERT(BINARY(CONVERT(
                         CONVERT(UNHEX(col) USING utf8)
                         USING latin1)) USING utf8);

Plus de discussion etPlus d'exemples de correction