У меня есть строка, хранящаяся в MySQL, как это: یکی از Ø
где набор символов моей таблицы – utf8
а сортировка – utf8_general_ci
.
Когда я извлекаю строку из MySQL, браузер показывает ее так: یکی از بهترین راه
и все в порядке (это персидский язык).
Заметка:
Я использовал mysql_query("SET NAMES 'utf8_persian_ci'");
после подключения к MySQL.
Я положил <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
тег в начало каждой страницы.
Теперь мне нужно использовать mysql_query("SET NAMES 'utf8'");
,
Но после его использования браузер показывает такую строку: یکی از Ø
(так же, как и в MySQL).
Как я могу изменить мои сохраненные записи 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:
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 .
Вероятно, вам нужно изменить столбец Charset и Collation.
Попробуйте выполнить этот запрос:
ALTER TABLE `YOUR_TABLE_NAME` CHANGE `YOUR_COLUMN_NAME` `YOUR_COLUMN_NAME` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
(В примере я предположил, что VARCHAR имеет значение DEFAULT NULL VALUE)
Если это сработает для вас, вы можете вставить в свой файл my.conf код ниже, чтобы сделать utf8 по умолчанию:
default-character-set = utf8
Возможные решения: