Sie leiden unter "doppelter Kodierung".
Folgendes ist passiert.
- Der Client hatte Zeichen, die als utf8 kodiert waren; und
SET NAMES latin1
gelogen, indem er behauptete, der Client habe eine latin1-Kodierung; und- Die Spalte in der Tabelle deklariert
CHARACTER SET utf8
.
Sehen wir uns an, was mit e-acute passiert:é
.
- Das Hex dafür ist in utf8 2 Bytes:
C3A9
. SET NAMES latin1
sah es als 2 latin1-codierte ZeichenÃ
und©
(hex:C3
undA9
)- Da das Ziel
CHARACTER SET utf8
war , diese 2 Zeichen mussten umgewandelt werden.Ã
wurde in utf8 konvertiert (hexC383
) und©
(hexC2A9
) - Also wurden 4 Bytes gespeichert (hex
C383C2A9
)
Beim erneuten Auslesen wurden die umgekehrten Schritte durchgeführt, und der Endbenutzer hat möglicherweise nichts Falsches bemerkt. Was ist falsch:
- Die gespeicherten Daten sind doppelt so groß wie sie sein sollten (dreimal für asiatische Sprachen).
- Vergleiche für gleich, größer als usw. funktionieren möglicherweise nicht wie erwartet.
ORDER BY
funktioniert möglicherweise nicht wie erwartet.
So etwas wird Ihre Daten reparieren:
UPDATE ... SET col = CONVERT(BINARY(CONVERT(
CONVERT(UNHEX(col) USING utf8)
USING latin1)) USING utf8);
Weitere Diskussionen und Weitere Beispiele zur Behebung