Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Aktualizacja danych w bazie danych MySQL po wstawieniu w złym kodowaniu

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:é .

  1. Kod szesnastkowy, w utf8 to 2 bajty:C3A9 .
  2. SET NAMES latin1 widziałem to jako 2 znaki zakodowane w języku łacińskim 1 Ã i © (szesnastkowy:C3 i A9 )
  3. Ponieważ celem był CHARACTER SET utf8 , te 2 znaki musiały zostać przekonwertowane.Ã został przekonwertowany na utf8 (hex C383 ) i © (szesnastkowy C2A9 )
  4. 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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyświetlanie zbioru danych JSON jako tabeli z Node.js i Express

  2. Wyszukiwanie zbliżeniowe

  3. Czy MySQL ignoruje wartości null w ograniczeniach unikalnych?

  4. Dynamiczny kursor w procedurze składowanej

  5. rake db:create - problemy z sortowaniem