sql >> Databáze >  >> RDS >> Mysql

Používat utf8 nebo ne - Problém s kódováním znaků MySQL a PHP

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:

  1. SET NAMES latin1;
  2. Vyberte každé jednotlivé textové pole z každé tabulky.
  3. SET NAMES utf8;
  4. 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 .



  1. Vraťte náhodné řádky z tabulky v MariaDB

  2. #1214 - Použitý typ tabulky nepodporuje FULLTEXTOVÉ indexy

  3. Tabulka mutuje, spouštěč/funkce to nemusí vidět (zabrání poklesu průměrné známky pod 2,5)

  4. Java - Výjimka v hlavním vláknu java.lang.Error:Nevyřešené problémy s kompilací