以前のencodingは sjis(cp932)やらeuc-jp等、作るものによってバラバラでしたが、utf8に統一されるようになってきたので、備忘として書いておきます。
http://search.cpan.org/perldoc?DBD::mysql
以下のようにdb接続時に mysql_enable_utf8 を指定すれば、perl-mysql間の文字列をフラグ付utf8に統一できます。
#!/usr/local/bin/perl use strict; use warnings; use utf8; use DBI; use Encode; use Data::Dumper; my $CONF_DB = {host => "localhost", port=> "3307", db_name=> "test_db", db_user=> "test_user", db_pass=> "ナイショ", db_opt=>{ AutoCommit=>0, RaiseError=>1, ShowErrorStatement=>1, #エラー時にSQLの中身も出力 mysql_enable_utf8=>1, on_connect_do => [ "SET NAMES 'utf8'", "SET CHARACTER SET 'utf8'" ], } }; main(); sub main { my $dbh = connect_db(); #DB接続 my $sql =<<EOF; #test sql select name from anken; EOF my $hash_ref = $dbh->selectrow_hashref($sql); #sql発行 my $is_flaged_utf8 = #utf8のフラグ有無確認 Encode::is_utf8($hash_ref->{name}) ? "utf8 flaged":"no utf8 flaged"; print encode('utf8',$hash_ref->{name}) , " : $is_flaged_utf8\n"; # $dbh->commit(); $dbh->disconnect(); #DB切断 } sub connect_db { my $db = "DBI:mysql:database=$CONF_DB->{db_name};host=$CONF_DB->{host}"; my $dbh = DBI->connect($db, $CONF_DB->{db_user}, $CONF_DB->{db_pass}, $CONF_DB->{db_opt}); #DB option設定 return $dbh; }
http://search.cpan.org/perldoc?DBD::Pg
postgres(DBD::Pg)では、pg_enable_utf8 のようですね。
#!/usr/local/bin/perl use strict; use DBI; use Data::Dumper; my $DB_CONF = {db_name => 'dbi:Pg:dbname=kaigan;host=localhost;port=5432;', user => 'postgres', passwd => '', option => {AutoCommit => 0, pg_enable_utf8 => 1}}; main(@ARGV); sub main { my ($lon_lat_file) = @_; my $dbh = connect_db(); #do something $dbh->disconnect(); } sub connect_db { return DBI->connect($DB_CONF->{db_name}, $DB_CONF->{user}, $DB_CONF->{passwd}, $DB_CONF->{option}); }