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:
SET NAMES latin1;
- Wybierz każde pole tekstowe z każdej tabeli.
SET NAMES utf8;
- 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
.