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 の使い方の問題であることがわかります。