[ Postgres ] 文字化け対策 ( SET CLIENT_ENCODING TO )

Pocket

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

参考
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *