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 :é
.
- L'hexadécimal pour cela, en utf8 est de 2 octets :
C3A9
. SET NAMES latin1
l'a vu comme 2 caractères encodés en latin1Ã
et©
(hexadécimal :C3
etA9
)- Puisque la cible était
CHARACTER SET utf8
, ces 2 caractères devaient être convertis.Ã
a été converti en utf8 (hexC383
) et©
(hexadécimalC2A9
) - 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