Cierpisz na „podwójne kodowanie”.
Oto, co się stało.
- Klient miał znaki zakodowane jako utf8; i
SET NAMES latin1kł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 latin1widziałem to jako 2 znaki zakodowane w języku łacińskim 1Ãi©(szesnastkowy:C3iA9)- 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 BYmoż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