Du lider av "dubbelkodning".
Här är vad som hände.
- Klienten hade tecken kodade som utf8; och
SET NAMES latin1
ljög genom att hävda att klienten hade latin1-kodning; och- Kolumnen i tabellen deklarerade
CHARACTER SET utf8
.
Låt oss gå igenom vad som händer med e-acute:é
.
- Hexan för det, i utf8 är 2 byte:
C3A9
. SET NAMES latin1
såg det som 2 latin1-kodade teckenÃ
och©
(hex:C3
ochA9
)- Eftersom målet var
CHARACTER SET utf8
, de två tecknen behövde konverteras.Ã
konverterades till utf8 (hexC383
) och©
(hexC2A9
) - Så, 4 byte lagrades (hex
C383C2A9
)
När du läste den igen utfördes de omvända stegen, och slutanvändaren märkte möjligen inget fel. Vad är fel:
- Datan som lagras är 2 gånger så stor som den borde vara (3x för asiatiska språk).
- Jämförelser för lika, större än osv kanske inte fungerar som förväntat.
ORDER BY
kanske inte fungerar som förväntat.
Något sådant här kommer att reparera dina data:
UPDATE ... SET col = CONVERT(BINARY(CONVERT(
CONVERT(UNHEX(col) USING utf8)
USING latin1)) USING utf8);
Mer diskussion ochFler exempel på att åtgärda det