DBD::Pg を使用して UTF8 文字列を PostgreSQL に挿入しようとしていますが、データベースでは常に二重にエンコードされた UTF8 を取得します。挿入する文字列が Latin1 の場合にのみ、DB で正しい文字を取得します。
DBD::Pg に、すでに UTF8 になっている文字列を再エンコードしないようにするにはどうすればよいですか?
テスト スクリプト:
!/usr/bin/perl
use strict;
my $PGDB = 'dbi:Pg:dbname=test;host=localhost';
my $PGDB_USER = 'username';
my $SQL_INSERT = 'INSERT INTO tmp1 (t1, t2) VALUES (?, ?)';
use DBI;
my $dbh = DBI->connect($PGDB, $PGDB_USER)
|| die "Couldn't connect to $PGDB as user $PGDB_USER: $DBI::errstr\n";
#$dbh->do("SET client_encoding TO UTF8");
my $sth = $dbh->prepare( $SQL_INSERT )
|| die "Can't prepare insert statement $SQL_INSERT: $DBI::errstr";
my $cp1252 = "\xe9 voil\xe0";
my $utf8 = "é voilà";
utf8::upgrade($utf8);
use utf8;
#use bytes;
my $text = 'sent utf8 w. utf8::upgrade';
$sth->execute($utf8, $text) or die $sth->errstr, "\n";
いくつかのテスト後の結果のテーブル:
é voilà sent cp1252 as_is w. use bytes
é voilà sent utf8 as_is w. use bytes
é voilà sent utf8 as_is w. use utf8
é voilà sent cp1252 as_is w. use utf8
é voilà sent cp1252 as_is w. do(SET client_encoding TO UTF8)
é voilà sent utf8 as_is w. do(SET client_encoding TO UTF8)
é voilà sent utf8 as_is w. use utf8 + do(SET client_encoding TO UTF8)
é voilà sent utf8 w. utf8::upgrade + do(SET client_encoding TO UTF8)
é voilà sent utf8 w. utf8::upgrade
(これは、DBD::Pg バージョン 3.5.3 を使用した Ubuntu 16.04 にあります。Ubuntu 12.04 にインストールされた DBD::Pg バージョンでは、この問題は発生しませんでした)