Решение проблем с кодировками MySQL


Чтобы решить проблему — достаточно понять логику работы. MySQL, начиная с версии 4.1, знает что такое кодировки и как с ними работать. Если до 4.0 он работал с байтами, то теперь он работает с символами.

MySQL написали шведы, поэтому кодировкой по умолчанию (сразу после установки) является latin1, а «сравнение» (последовательность букв, алфавит; влияет на сортировки) — latin1_swedish.

Итак, где кодировки указываются:

1. Кодировка конкретной базы/таблицы/столбца. Это кодировка, в которой MySQL будет хранить данные. Например, если у вас данные в cp1251, то будет большой ошибкой указывать для хранения кодировку latin1. В ней нет соответствий для русских символов, все они будут заменены на вопросы. Кодировка хранения можно задать, например, так:
create database `имя базы` default charset cp1251;
Если кодировка не указана — будет использовано значение параметра default-character-set из файла /etc/my.cnf (либо latin1, если параметра нет). Кстати, именно этот параметр редактирует ISPmanager в свойствах сервера баз данных.

2. Кодировка соединения. Это кодировка, в которой клиент (скрипт пользователя, форум, mysql-клиент и т.д.) общается с MySQL. Когда клиент подсоединяется к серверу, тот ему сообщает значение параметра default-character-set. Таким образом, они договариваются о том, в какой кодировке они будут общаться. Кодировку общения можно изменить запросом (его лучше выполнять сразу после соединения с сервером):
set names cp1251
Кстати, множество современных правильных скриптов именно это и делают.
Одна сложность: есть ряд кривых клиентов, которые всего этого не понимают и общаются в какой-то своей кодировке. Персонально для них можно написать в /etc/my.cnf, секцию [mysqld]:
[mysqld]
set init_connect=»set names utf8″
Что это означает? Сразу после подсоединения любого клиента, MySQL выполнит запрос «set names utf8», как будто смену кодировки общения запросил сам клиент.
Это всё, что нужно знать для решения любой проблемы с кодировками в MySQL. Осталось несколько уточнений (самое интересное 🙂
phpMyAdmin, mysqldump — обычные клиенты, на них действуют те же самые правила.

Одно «но»: на все PHP-скрипты (включая phpMyAdmin) действует default-character-set из секции [client] в my.cnf. Для mysqldump есть отдельная секция [mysqldump]. ISPmanager прописывает default-character-set во все секции.
Дамп базы — это обычный набор MySQL-команд. Если вы в самое его начало напишете «set names cp1251;», то эта команда тоже выполнится и MySQL будет считать, что дальше все данные в дампе идут в кодировке cp1251.
Кодировки в MySQL-командах пишутся без кавычек и без «-» (дефисов). Популярные в России кодировки: utf8, cp866 (DOS), cp1251 (windows-1251), koi8r.
И, наконец, пара советов:
Если вы в этом новичок, постарайтесь свести всё к одной кодировке. Пусть у вас дамп и «default-character-set» (напомню, влияет на кодировку хранилища при создании таблиц и на кодировку общения с клиентом) будет в одной кодировке. Это избавит от путаницы и решит 90% проблем.
Если есть возможность — используйте консольную утилиту mysqldump.

phpMyAdmin — это дополнительная прослойка, которая лишь добавляет свою путаницу и свои баги.

Русификация MySQL

Чтобы русифицировать базу данных MySQL, не вдаваясь в подробности почему и как, проделайте следующие процедуры:

1. В файле /etc/my.cnf добавьте следующие строчки:
1.1. Под разделом [client]
default-character-set=cp1251
1.2. Под разделом [mysqld]
character-set-server=cp1251
collation-server=cp1251_general_ci
init-connect = «set names cp1251»
После этого перезапустите базу MySQL или весь ваш виртуальный сервер (из ISPmanager или консоль).