У меня есть строка, хранящаяся в 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
Возможные решения: