Cierpisz na „podwójne kodowanie”.
Oto, co się stało.
- Klient miał znaki zakodowane jako utf8; i
SET NAMES latin1
kłamał, twierdząc, że klient miał kodowanie latin1; i- Kolumna w tabeli zadeklarowana jako
CHARACTER SET utf8
.
Zobaczmy, co dzieje się z e-acute:é
.
- Kod szesnastkowy, w utf8 to 2 bajty:
C3A9
. SET NAMES latin1
widziałem to jako 2 znaki zakodowane w języku łacińskim 1Ã
i©
(szesnastkowy:C3
iA9
)- Ponieważ celem był
CHARACTER SET utf8
, te 2 znaki musiały zostać przekonwertowane.Ã
został przekonwertowany na utf8 (hexC383
) i©
(szesnastkowyC2A9
) - Zapisano więc 4 bajty (hex
C383C2A9
)
Odczytując go ponownie, wykonano odwrotne kroki i użytkownik końcowy prawdopodobnie nie zauważył niczego złego. Co jest nie tak:
- Przechowywane dane są 2 razy większe niż powinny (3x w przypadku języków azjatyckich).
- Porównania równych, większych niż itp. mogą nie działać zgodnie z oczekiwaniami.
ORDER BY
może nie działać zgodnie z oczekiwaniami.
Coś takiego naprawi Twoje dane:
UPDATE ... SET col = CONVERT(BINARY(CONVERT(
CONVERT(UNHEX(col) USING utf8)
USING latin1)) USING utf8);
Więcej dyskusji iWięcej przykładów naprawy