Программирование
On-line приложения
Почитать
Web-сервер Apache
Печать и форматирование
MySQL
Разные рецепты
Сборка/установка
Справки
Философия
Мой опыт
Скачать
Программы на Tcl/Tk (GUI)
Программы на Python/Tk (GUI)
Программы (CLI)
Help
Хобби
Фракталы
on-line
Язык для рисования фракталов
Гиперкуб
Теория относительности
Ампуллярии
Преподавание
Студенту/абитуриенту
Мой опыт
Автора!

Кодировка в MySQL 4.1

Несколько слов о кодировках в MySQL 4.1 (но не 4.0).

Самое приятное в версии 4.1 то, что кодировки в которых работают клиент и сервер можно указывать отдельно. Поэтому для смены кодировки пересобирать сервер совсем не обязательно.

Настройка клиентов через my.cnf

Если mysql поставить уже бинарный, то в простейшем случае имеет смысл написать в /etc/my.cnf:

[mysqld]
default-character-set=koi8r
character-set-server=koi8r
[client]
default-character-set=koi8r
[mysql]
default-character-set=koi8r

После этого русские буквы будут работать во всех программах, которые знают о существовании /etc/my.cnf. Всем прочим об этом надо сообщать отдельно. Например Perl/DBI узнаёт о расположении конфигурационного файла так:

my $db=DBI->connect('DBI:mysql:cgi_mail:localhost:mysql_read_default_file=/etc/my.cnf',
                    'root', '');

Можно создать отдельный файл, скажем /etc/my.cnf-win. Написать в нём примерно следующее:

[perl]                                                                        
default-character-set=cp1251

После этого можно соединиться с базой, указав эти настройки:

my $db=DBI->connect(
  'DBI:mysql:cgi_mail:localhost:mysql_read_default_file=/etc/my.cnf-win;'.
  'mysql_read_default_group=perl', 'root', '');

То есть мы указали какой файл надо прочитать и какую группу строк в нём следует рассмотреть. Теперь Perl-сценарий будет получать данные в кодировке cp1251, хотя сама база лежит в кодировке koi8r. Все сортировки и регистр-независимые операции идут абсолютно корректно.

Настройка соединения руками

Соединение можно настроить и руками. Для этого надо послать серверу соответствующие команды, декларировав необходимую кодировку.

Пример на Perl:

my $db=DBI->connect('DBI:mysql:cgi_mail:localhost', 'root', '');
$db->do('SET CHARACTER SET cp1251');

Можно использовать эквивалентный набор SQL-команд set.

Пример на PHP:

mysql_connect('localhost', 'user') or die;
mysql_select_db('test') or die;
mysql_query('set character_set_results=koi8r') or die(mysql_error());
mysql_query('set character_set_client=koi8r') or die(mysql_error());
mysql_query('set character_set_connection=koi8r') or die(mysql_error());

Посмотреть все доступные кодировки можно так:

SHOW CHARACTER SET;

Какой способ лучше

Настроить /etc/my.cnf полезно, если вы используете родной mysql-клиент. На серверах, где нет удалённого shell'a настраивать локального клиента командной строки вообще нет смысла.

В программах, использование /etc/my.cnf даёт большую гибкость при перенастройке и переходах с версии на версию, с хоста на хост и прочее. Но настройка соединения самим клиентом позволяет более тонко управлять параметрами. Например, вы можете установить часовой пояс:

$db->do(q|set time_zone='+04:00'|);

Из /etc/my.cnf этого сделать нельзя (можно, но только глобально, для всей базы, а не для конкретного соединения).

Мои собственные утилиты для работы с MySQL находятся по ссылке.

Эта страница набрала не малую популярность, её посещает множество людей, поэтому я решил провести небольшое исследование. Если у вас есть комментарий, если вы сочли полученную информацию полезной, не полной, или вообще бесполезной, вы можете высказать своё мнение, пожелания, дополнения.

Если вы ожидаете получить от меня ответ или разъяснение, пожалуйста укажите e-mail, ICQ или другую контактную информацию.
Ваше сообщение не появится на странице, а просто отправится мне.

© 1999 − 2008 Мичурин Алексей — http://www.michurin.com.ru/