Кодировка в MySQL 4.1 : русские кодировки koi8r, windows 1251

Несколько слов о кодировках в 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 этого сделать нельзя (можно, но только глобально, для всей базы, а не для конкретного соединения).


Комментарии запрещены.





Статистика

Рейтинг@Mail.ru