Je hebt last van "dubbele codering".
Dit is wat er is gebeurd.
- De client had tekens gecodeerd als utf8; en
SET NAMES latin1
loog door te beweren dat de client latin1-codering had; en- De kolom in de tabel verklaarde
CHARACTER SET utf8
.
Laten we eens kijken wat er met e-acute gebeurt:é
.
- De hex daarvoor, in utf8 is 2 bytes:
C3A9
. SET NAMES latin1
zag het als 2 latin1-gecodeerde tekensÃ
en©
(hex:C3
enA9
)- Sinds het doel
CHARACTER SET utf8
. was , die 2 tekens moesten worden geconverteerd.Ã
is geconverteerd naar utf8 (hexC383
) en©
(hexC2A9
) - Er zijn dus 4 bytes opgeslagen (hex
C383C2A9
)
Bij het terug uitlezen zijn de stappen in omgekeerde volgorde uitgevoerd en heeft de eindgebruiker mogelijk niets verkeerds opgemerkt. Wat is er mis:
- De opgeslagen gegevens zijn 2 keer zo groot als ze zouden moeten zijn (3x voor Aziatische talen).
- Vergelijkingen voor gelijk, groter dan, enz. werken mogelijk niet zoals verwacht.
ORDER BY
werkt mogelijk niet zoals verwacht.
Zoiets zal je gegevens herstellen:
UPDATE ... SET col = CONVERT(BINARY(CONVERT(
CONVERT(UNHEX(col) USING utf8)
USING latin1)) USING utf8);
Meer discussie enMeer voorbeelden om het te repareren