Du lider af "dobbeltkodning".
Her er, hvad der skete.
- Klienten havde tegn kodet som utf8; og
SET NAMES latin1
lø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 latin1
så det som 2 latin1-kodede tegnÃ
og©
(hex:C3
ogA9
)- 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 BY
fungerer 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