Váš problém je, že vaše SET NAMES 'utf8_persian_ci'
příkaz byl neplatný (utf8_persion_ci je porovnání , nikoli kódování ). Pokud jej spustíte v terminálu, zobrazí se chyba Unknown character set: 'utf8_persian_ci'
. Tedy vaše aplikace, když se uložila data, používal latin1
znaková sada. MySQL interpretovalo váš vstup jako znaky latin1, které pak uložilo zakódované jako utf-8. Podobně, když byla data vytažena zpět, MySQL je převedla z UTF-8 zpět na latin1 a (doufejme, že většinou) původní bajty, které jste jim dali.
Jinými slovy, všechna vaše data v databázi jsou úplně zpackaná, ale náhodou to fungovalo.
Chcete-li to opravit, musíte vrátit zpět, co jste udělali. Nejpřímější způsob je použití PHP:
SET NAMES latin1;
- Vyberte každé jednotlivé textové pole z každé tabulky.
SET NAMES utf8;
- Aktualizujte stejné řádky pomocí stejného řetězce beze změny.
Alternativně můžete tyto kroky provést uvnitř MySQL, ale je to složité, protože MySQL chápe, že data jsou v určité znakové sadě. Je třeba upravit textové sloupce na typ BLOB a poté je upravit zpět na textové typy se znakovou sadou utf8. Viz část v dolní části ALTER TABLE
Dokumentace MySQL označená jako „Upozornění“ červeně
.
Poté, co uděláte jednu z těchto věcí, bajty uložené ve sloupcích databáze budou skutečnou znakovou sadou, za kterou se považují. Poté se ujistěte, že vždy používáte mysql_set_charset('utf8')
na jakýkoli přístup k databázi z PHP, který můžete v budoucnu udělat! Jinak si věci zase pokazíte. (Poznámka:nepoužívejte jednoduchý mysql_query('SET NAMES utf8')
! Existují rohové případy (jako je reset připojení), kde lze toto resetovat na latin1
bez tvého vědomí. mysql_set_charset()
v případě potřeby nastaví znakovou sadu.)
Nejlepší by bylo, kdybyste přešli z mysql_*
funkce a použité PDO
místo toho pomocí charset=utf8
parametr ve vašem PDO dsn
.