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
.