Thursday, February 28, 2008

DBD::mysql character set

порывшись некоторое время в документации mysql, я понял, что гарантированно выставить кодироку клиента, а именно character_set_client, character_set_results, character_set_connection в какую-то кодировку можно только с помощью «set names utf8». потому как не всегда есть возможность сменить кодировку в конфигурации сервера. теперь о том, если нет возможности использовать «set names».

оказывается, DBD::mysql позволяет использовать некоторые дополнительные переменные при соединении, как то mysql_read_default_group и mysql_read_default_file. как это может помочь мне для установки кодировки данных для клиента:

dbitest.pl:


#!/usr/bin/perl

use strict;
use DBI;

print `mysql -e 'show variables' | grep char`;
print "\n";

my $conn_str = join ';',
'DBI:mysql:database=mysql',
'mysql_read_default_group=perl',
'mysql_read_default_file=/home/apla/my.cnf';

my $d = DBI->connect($conn_str, "***", "***");
my $s = $d->prepare ('show variables like "char%"');
$s->execute;
my $vars = $s->fetchall_arrayref;

foreach (@$vars) {
print "$_->[0] => $_->[1]\n";
}


my.cnf

[perl]
default-character-set=cp1251


соответственно, group это то, что находится внутри квадратных скобок, то есть [group], а file - это если вы не хотите использовать стандартную конфигурацию, то можете использовать свою собственную.

результат:


perl dbitest.pl
character_set_client latin1
character_set_connection latin1
character_set_database latin1
character_set_filesystem binary
character_set_results latin1
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/

character_set_client => cp1251
character_set_connection => cp1251
character_set_database => latin1
character_set_filesystem => binary
character_set_results => cp1251
character_set_server => latin1
character_set_system => utf8
character_sets_dir => /usr/share/mysql/charsets/


mysql 5.0.26

1 comment:

Unknown said...
This comment has been removed by the author.