MySQL, PHP и кодировки. Ultimate guide. (Рейтинг: +4)

Печать / RSS
Всё что вы когда-либо хотели знать про mysql, php и кодировки, но боялись спросить! Почему кириллица на сайте отображается вопросами? Как правильно настроить сервер mysql для работы с кириллицей? Как поменять кодировку в mysql? Как изменить кодировку в скриптах php? Какую выбрать кодировку? Как сконвертировать базу данных из одной кодировки в другую? Эти и многие подобные вопросы с завидным упорством снова и снова поднимаются на различных форумах уже который год. В этом посте я постарался рассказать что нужно делать чтобы такие проблемы не возникали и дать наиболее эффективные советы на тот случай если они все-таки возникнут. Если вы не найдете ответ на свой вопрос здесь – напишите мне и я обязательно дополню этот текст с учетом вашего случая

Mysql, php и кодировки. Источник проблем.

Проблемы с кодировками в Mysql обусловлены историей создания этой программы. Так как разрабатывали mysql – европейцы – для них было естественно выбрать в качестве основной кодировки более удобную для себя latin1. Странно, но и по сей день большинство инсталляций Mysql по умолчанию работают с этой кодировкой что и создает для пользователей кириллицы проблемы с добавлением в базу данных строк на русском и украинском языках – в latin1 эти символы просто отсутствуют.

Поэтому первое что нужно сделать при возникновении проблем с кодировками в mysql – нужно проверить какая кодировка является для данной инсталляции mysql основной. Проверить это можно несколькими способами.
Настройка сервера mysql для нужной кодировки.
Если вы админ сервера или вы самостоятельно настраиваете собственную mysql на рабочей машине.
Откройте файл конфигурации mysql.ini (/etc/mysql.cnf для os linux) и найдите такие строки.

[mysqld]
default-character-set=название_кодировки
character-set-server=название_кодировки
init-connect="SET NAMES название_кодировки"
skip-character-set-client-handshake

Вместо “название_кодировки” нужно подставить название той кодировки, которую вы будете использовать. Для текстов на русском и украинском языках можно использовать utf8 или cp1251 (обратите внимание – названия кодировок в mysql пишутся без обычного дефиса!!!). Но я советовал бы использовать только utf8 – так вы себе сэкономите в будущем немало нервов.

Если такие строки в файле конфигурации отсутствуют, то это означает что база данных использует по умолчанию ту кодировку, которая была задана при компиляции. Добавьте в конфиг нужные вам настройки кодировок (примеры ниже) и перезапустите mysql.

Если у вас возникли проблемы с кодировкой на хостинге, где вы не имеете прав администратора, то проверить настройки кодировки для mysql вы сможете другим способом: установите соединение с mysql (при помощи консольной команды mysql или phpmyadmin – как вам удобнее) и выполните такой sql-запрос: show variables like ‘char%’. Этот запрос покажет вам значения переменных mysql, которые имеют отношение к кодировкам. Скорее всего, вы увидите что-то вроде такого
character_set_client latin1
character_set_connection latin1
character_set_database cp1251
character_set_filesystem binary
character_set_results latin1
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/



Я специально привел выше пример НЕПРАВИЛЬНО НАСТРОЕННОГО СЕРВЕРА!!! Обратите внимание – в нем используются в разных случаях три(!) разные кодировки. Начинающему веб-программисту в такой ситуации будет сложно добиться корректной работы скрипта. Старайтесь чтобы все переменные были настроены на работу с одной и той же кодировкой. Тогда 99% проблем которые обсуждаются на форумах у вас просто не возникнут. Тут даже не столь важно какую именно кодировку вы выберете – главное чтобы она была везде одинаковой. Но все-таки старайтесь указывать в настройках ту кодировку, которую действительно будете использовать для хранения данных.

Итак, удачный вариант – это если команда show variables like ‘char%’ из абзаца выше покажет вам список одинаковых кодировок для каждой из переменных и еще лучше будет если эта кодировка совпадет с той которую используете вы.

Если же кодировка mysql отличается от вашей – не спешите расстраиваться. Изменить любую из этих переменных вы можете либо глобально, для всех правкой конфигов (если вы администратор сервера), либо только для себя – sql-запросом set character_set_database=utf8 (если вы пользователь). Такой запрос должен будет выполняться из вашего php скрипта сразу после установки соединения с сервером mysql. Ниже пример для установки кодировки utf8 из php скрипта.
mysql_query('SET character_set_database = utf8');
mysql_query('SET NAMES utf8');

Настройки для cp1251 выставляются аналогично.
mysql_query('SET character_set_database = cp1251');
mysql_query('SET NAMES cp1251');

Что касается character_set_database – постарайтесь сразу создать базу данных в нужной кодировке (как вариант – отправьте такую просьбу в техподдержку хостинга), тогда вы избежите по крайней мере одного лишнего запроса к mysql во время работы скрипта. Если удастся,то строчку с ‘character_set_database’ из приведенного выше кода можно будет удалить.
Примеры настроек сервера mysql для правильной работы с кодировками.

При правильно настроенном сервере делать запросы из скрипта для установки правильной кодировки уже будет не нужно.

Настройки для utf8
[mysqld]
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci
init-connect="SET NAMES utf8"
skip-character-set-client-handshake

[mysqldump]
default-character-set=utf8

[client]
default-character-set = utf8

Настройки для cp1251
[mysqld]
default-character-set=cp1251
character-set-server=cp1251
collation-server=cp1251_general_ci
init-connect="SET NAMES cp1251"
skip-character-set-client-handshake

[mysqldump]
default-character-set=cp1251

[client]
default-character-set = cp1251
Проверка реальной кодировки в которой хранятся базы данных mysql.

В случае если вы все (и сервер, и php скрипт) настроили правильно, по инструкции выше, но русские буквы все равно не отображаются – проверьте действительно ли ваши строки сохранены в той кодировке, которую вы указали в настройках!!!

Простой способ проверки – сделайте дамп базы данных в sql-формате и откройте его в текстовом редакторе. Sql-формат – это обычный текст. Если ваша база данных mysql в кодировке cp1251 – открывайте в Блокноте. Если utf8 – в любом редакторе с поддержкой Юникода. Пролистайте файл и убедитесь что все надписи с кириллицей нормально читаются и что sql-команды create table и create database, которые встречаются в дампе содержат правильные названия кодировки mysql (той кодировки, которая вами была указана в настройках сервера или в запросах из php-скриптов.

Если кодировка не подходит – сделайте бекап базы на всякий случай, перекодируйте sql-дамп в любом текстовом перекодировщике, замените названия кодировок в файле на правильные и заливайте полученный файл на сервер mysql. Теперь с кодировками все должно быть в порядке ).gif
Автор: XoPyC (12.07.10 / 21:52)
php, sql, кодировки
Рейтинг: +4
Просмотры: 5092
Комментарии (5) »