Perl から DBI モジュールで Postgres からデータを取得する場合に文字化けすることがあります。特に Perl の文字コードとデータベースの文字コードが異なる場合に注意が必要です。
スポンサーリンク
Perl ( DBI ) + Postgres の文字化け対策
データベースから取得したデータが文字化けする場合には、SET CLIENT_ENCODING TO コマンドでクライアント( 今回の場合は Perl の文字コード )の文字コードをデータベースに通知することで文字化けが解消されることがあります。詳細はサンプル中のコメントを参照ください。
use DBI; # # データベースの接続情報 # my $DB_NAME = "dbname"; my $DB_USER = "postgres"; my $DB_PASS = "passwd"; my $DB_HOST = "localhost"; my $DB_PORT = "5432"; # Database 接続 my $dbh = DBI->connect("dbi:Pg:dbname=$DB_NAME;host=$DB_HOST;port=$DB_PORT", $DB_USER, $DB_PASS, { AutoCommit => 0}) or die "$!\n Error: failed to connect to DB.\n"; # クライアントで使用してるエンコーディングをセットする。 # このコマンドを実行していないと、以下の環境で文字化けが発生した。 # Perl:UTF-8 Postgres9.3:EUC-JP $dbh->do("SET CLIENT_ENCODING TO 'UTF-8';"); my $sth = $dbh->prepare("select id, name from table1"); # クエリ実行 $sth->execute(); while (my $ary_ref = $sth->fetchrow_arrayref) { # 1行取得 my ($id, $name) = @$ary_ref; # # 何か必要な処理 # } # データベース切断 $dbh->disconnect;
上記サンプルより、Perl や DBI ではなく、Postgres の使い方の問題であることがわかります。