Проблемът ви е, че вашият SET NAMES 'utf8_persian_ci'
командата беше невалидна (utf8_persion_ci е колекция , а не кодиране ). Ако го стартирате в терминал, ще видите грешка Unknown character set: 'utf8_persian_ci'
. Така вашето приложение, когато е съхранено данните, използваше latin1
набор от символи. MySQL интерпретира въведените ви като символи latin1, които след това съхранява кодирани като utf-8. По същия начин, когато данните бяха изтеглени обратно, MySQL ги преобразува от UTF-8 обратно в latin1 и (надявам се, през повечето време) оригиналните байтове, които сте им дали.
С други думи, всичките ви данни в базата данни са напълно объркани, но просто така се случи да работи.
За да поправите това, трябва да отмените това, което сте направили. Най-простият начин е използването на PHP:
SET NAMES latin1;
- Изберете всяко отделно текстово поле от всяка таблица.
SET NAMES utf8;
- Актуализирайте същите редове, като използвате същия низ без промяна.
Като алтернатива можете да изпълните тези стъпки в 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
.