Du lider af "dobbeltkodning".
Her er, hvad der skete.
- Klienten havde tegn kodet som utf8; og
SET NAMES latin1løj ved at hævde, at klienten havde latin1-kodning; og- Kolonnen i tabellen erklærede
CHARACTER SET utf8.
Lad os gennemgå, hvad der sker med e-acute:é .
- Hexet for det i utf8 er 2 bytes:
C3A9. SET NAMES latin1så det som 2 latin1-kodede tegnÃog©(hex:C3ogA9)- Da målet var
CHARACTER SET utf8, de 2 tegn skulle konverteres.Ãblev konverteret til utf8 (hexC383) og©(hexC2A9) - Så, 4 bytes blev gemt (hex
C383C2A9)
Når du læste det igen, blev de omvendte trin udført, og slutbrugeren bemærkede muligvis intet galt. Hvad er der galt:
- De lagrede data er 2 gange så store, som de burde være (3x for asiatiske sprog).
- Sammenligninger for lig, større end osv. fungerer muligvis ikke som forventet.
ORDER BYfungerer muligvis ikke som forventet.
Noget som dette vil reparere dine data:
UPDATE ... SET col = CONVERT(BINARY(CONVERT(
CONVERT(UNHEX(col) USING utf8)
USING latin1)) USING utf8);
Mere diskussion ogFlere eksempler på at rette det