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

Ciągi znaków UTF-8 w bazie danych MySQL zostały zepsute po zmianie konfiguracji

C3 83 C6 92 C3 82 C2 AA
C3 3F C2 AA

To właśnie otrzymasz, jeśli potraktujesz sekwencję bajtów jako UTF-8, a następnie zakodujesz ją jako ISO-8859-1. 3F to jest ? , który został dołączony jako znak zastępczy, ponieważ UTF-8 C6 92 to U+0192 ƒ który nie istnieje w ISO-8859-1. Ale istnieje w stronie kodowej Windows 1252 Western European, kodowaniu bardzo podobnym do ISO-8859-1; tam jest to bajt 0x83.

C3 83 C2 AA

Przejdź przez kolejną rundę traktowania jako UTF-8-bajtów i kodowania-do-cp1252, a otrzymasz:

C3 AA

czyli wreszcie UTF-8 dla ê .

Zwróć uwagę, że nawet jeśli podajesz stronę HTML inną niż XML wyraźnie jako ISO-8859-1, przeglądarki będą faktycznie używać kodowania cp1252 z powodu nieprzyjemnych przyczyn historycznych.

Niestety MySQL nie posiada kodowania cp1252; latin1 jest (poprawnie) ISO-8859-1. Więc nie będziesz w stanie naprawić danych przez zrzucenie jako latin1, a następnie ponowne załadowanie jako utf8 (dwa razy). Musiałbyś przetworzyć skrypt za pomocą edytora tekstu, który można zapisać jako albo (lub np. w Pythonie file(path, 'rb').read().decode('utf-8').encode('cp1252').decode('utf-8').encode('cp1252') ).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę wstawić duże pliki do bazy danych MySQL za pomocą PHP?

  2. Błąd MySQL 1093 - Nie można określić tabeli docelowej do aktualizacji w klauzuli FROM

  3. Problem z instalacją RMySQL z Mysql 5.5

  4. Narzędzie, które konwertuje zapytanie mySQL na zapytanie Zend FrameWork

  5. Przechowywanie dat w Hibernate jako daty czasu UTC?