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

Aby używać utf8, czy nie - problem z kodowaniem znaków MySQL i PHP

Twój problem polega na tym, że Twój SET NAMES 'utf8_persian_ci' polecenie było nieprawidłowe (utf8_persion_ci to zestawianie , a nie kodowanie ). Jeśli uruchomisz go w terminalu, zobaczysz błąd Unknown character set: 'utf8_persian_ci' . Tak więc Twoja aplikacja, gdy przechowała dane, używał latin1 zestaw znaków. MySQL zinterpretował twoje dane wejściowe jako znaki latin1, które następnie zakodował jako utf-8. Podobnie, gdy dane zostały wyciągnięte, MySQL przekonwertował je z UTF-8 z powrotem na latin1 i (miejmy nadzieję, przez większość czasu) oryginalne bajty, które mu podałeś.

Innymi słowy, wszystkie twoje dane w bazie danych są kompletnie pomieszane, ale akurat tak się złożyło.

Aby to naprawić, musisz cofnąć to, co zrobiłeś. Najprostszym sposobem jest użycie PHP:

  1. SET NAMES latin1;
  2. Wybierz każde pole tekstowe z każdej tabeli.
  3. SET NAMES utf8;
  4. Aktualizuj te same wiersze, używając niezmienionego ciągu znaków.

Alternatywnie możesz wykonać te kroki w MySQL, ale jest to trudne, ponieważ MySQL rozumie, że dane znajdują się w określonym zestawie znaków. Musisz zmodyfikować kolumny tekstowe do typu BLOB, a następnie zmodyfikować je wstecz do typów tekstu z zestawem znaków utf8. Zobacz sekcję na dole ALTER TABLE Dokumentacja MySQL oznaczona jako „Ostrzeżenie” na czerwono .

Po wykonaniu jednej z tych czynności bajty przechowywane w kolumnach bazy danych będą rzeczywistym zestawem znaków, za który się podają. Następnie upewnij się, że zawsze używasz mysql_set_charset('utf8') na dowolnym dostępie do bazy danych z PHP, który możesz zrobić w przyszłości! W przeciwnym razie znowu coś zepsujesz. (Uwaga, nie używaj prostego mysql_query('SET NAMES utf8') ! Istnieją przypadki narożne (takie jak resetowanie połączenia), w których można to zresetować do latin1 bez twojej wiedzy. mysql_set_charset() ustawi zestaw znaków w razie potrzeby.)

Byłoby najlepiej, gdybyś zrezygnował z mysql_* funkcje i używane PDO zamiast tego z charset=utf8 parametr w twoim PDO dsn .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. php/mysql z wieloma zapytaniami

  2. najlepsza struktura drzewa php / Mysql

  3. Przewodnik po projektowaniu bazy danych dla systemu sieci społecznościowych w MySQL

  4. Skopiuj wiersz, ale z nowym identyfikatorem

  5. BŁĄD 2002 (HY000):Nie można połączyć się z lokalnym serwerem MySQL przez gniazdo „/tmp/mysql.sock”