Je hebt last van "dubbele codering".
Dit is wat er is gebeurd.
- De client had tekens gecodeerd als utf8; en
SET NAMES latin1loog 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 latin1zag het als 2 latin1-gecodeerde tekensÃen©(hex:C3enA9)- 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 BYwerkt 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