Użyj mysqli_set_charset
aby zmienić kodowanie klienta na UTF-8 zaraz po połączeniu:
$mysqli->set_charset("utf8");
Kodowanie klienta jest tym, czego MySql oczekuje od danych wejściowych (np. podczas wstawiania tekstu dostarczonego przez użytkownika do zapytania wyszukiwania) i tego, co daje wyniki (więc musi pasować do kodowania wyjściowego, aby echo
aby wyświetlać rzeczy poprawnie).
Musisz dopasować kodowanie Twojej strony internetowej, aby uwzględnić dwa powyższe scenariusze i kodowanie pliku źródłowego PHP (aby zakodowane na sztywno części zapytań były poprawnie interpretowane).
Aktualizacja:jak przekonwertować dane wstawione za pomocą latin-1 na utf-8
Jeśli chodzi o dane, które zostały już wstawione przy użyciu złego kodowania połączenia, istnieje wygodne rozwiązanie problemu. Dla każdej kolumny zawierającej tego rodzaju dane musisz wykonać:
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET latin1;
ALTER TABLE table_name MODIFY column_name BLOB;
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET utf8;
Symbole zastępcze table_name
, column_name
i existing_column_type
należy za każdym razem zastąpić poprawnymi wartościami z bazy danych.
To, co to robi, to
- Powiedz MySql, że musi przechowywać dane w tej kolumnie w latin1. Ten zestaw znaków zawiera tylko mały podzbiór utf8, więc ogólnie ta konwersja wiąże się z utratą danych, ale w tym konkretnym scenariuszu dane zostały już zinterpretowane jako latin1 na wejściu, więc nie będzie żadnych skutków ubocznych. Jednak MySql wewnętrznie przekonwertuje bajtową reprezentację twoich danych, aby pasowała do tego, co zostało pierwotnie wysłane z PHP.
- Konwertuj kolumnę na typ binarny (
BLOB
), który nie ma powiązanych informacji o kodowaniu. W tym momencie kolumna będzie zawierać surowe bajty, które są prawidłowym ciągiem znaków utf8. - Konwertuj kolumnę na jej poprzedni typ znaku, informując MySql, że surowe bajty powinny być uważane za zakodowane w utf8.
OSTRZEŻENIE:tego bezkrytycznego podejścia można użyć tylko wtedy, gdy dana kolumna zawiera tylko nieprawidłowo wstawione dane. Wszelkie prawidłowo wstawione dane zostaną obcięte przy pierwszym wystąpieniu dowolnego znaku spoza zestawu ASCII!
Dlatego dobrze jest zrobić to teraz, zanim wejdzie w życie poprawka po stronie PHP.