Mysql
 sql >> база данни >  >> RDS >> Mysql

За да използвате utf8 или не - проблем с кодирането на символи в MySQL и PHP

Проблемът ви е, че вашият SET NAMES 'utf8_persian_ci' командата беше невалидна (utf8_persion_ci е колекция , а не кодиране ). Ако го стартирате в терминал, ще видите грешка Unknown character set: 'utf8_persian_ci' . Така вашето приложение, когато е съхранено данните, използваше latin1 набор от символи. MySQL интерпретира въведените ви като символи latin1, които след това съхранява кодирани като utf-8. По същия начин, когато данните бяха изтеглени обратно, MySQL ги преобразува от UTF-8 обратно в latin1 и (надявам се, през повечето време) оригиналните байтове, които сте им дали.

С други думи, всичките ви данни в базата данни са напълно объркани, но просто така се случи да работи.

За да поправите това, трябва да отмените това, което сте направили. Най-простият начин е използването на PHP:

  1. SET NAMES latin1;
  2. Изберете всяко отделно текстово поле от всяка таблица.
  3. SET NAMES utf8;
  4. Актуализирайте същите редове, като използвате същия низ без промяна.

Като алтернатива можете да изпълните тези стъпки в MySQL, но това е трудно, защото MySQL разбира, че данните са в определен набор от знаци. Трябва да модифицирате текстовите си колони до тип BLOB, след което да ги модифицирате назад към текстови типове с набор от символи utf8. Вижте раздела в долната част на ALTER TABLE Документация на MySQL с надпис „Предупреждение“ в червено .

След като направите едно от тези неща, байтовете, съхранени в колоните на вашата база данни, ще бъдат действителният набор от знаци, за който твърдят, че са. След това уверете се, че винаги използвате mysql_set_charset('utf8') на всеки достъп до база данни от PHP, който може да правите в бъдеще! В противен случай пак ще объркате нещата. (Забележка, не използвайте обикновен mysql_query('SET NAMES utf8') ! Има ъглови случаи (като връзка за нулиране), където това може да бъде нулирано на latin1 без твое знание. mysql_set_charset() ще зададе набора от знаци, когато е необходимо.)

Най-добре би било да изключите mysql_* функции и използвани PDO вместо това с charset=utf8 параметър във вашия PDO dsn .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Трябва ли първичните ключове на базата данни да бъдат цели числа?

  2. Как да покажа последните изпълнени заявки на MySQL?

  3. намиране на продукти, които клиентите купуват заедно

  4. Поддръжка на PDO за множество заявки (PDO_MYSQL, PDO_MYSQLND)

  5. Каква е алтернативата за генерирана колона в MySQL 5.6