|
Кодировка в 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
находятся по ссылке.
|