- 2006-07-31
- perl
DBD::Pg で取得した文字列に自動的に utf8 フラグを付けるには、$dbh->{pg_enable_utf8} を 1 にする。 ただ、これは本当に utf8 フラグを付けるということしかしないようなので、client_encoding を utf8 にするのは自分でやらなきゃいけないようだ。 client_encoding と連動してくれても良さそうな気もする。
データベースが euc-jp、ソースコードが utf-8 の例はこんな感じ。
#!/usr/bin/perl
use Encode;
use DBI;
use Data::Dumper;
my $dbh = DBI->connect("dbi:Pg:options='-c client_encoding=utf8'", "", "");
my $q = "select 'あいうえお'::text";
$dbh->{pg_enable_utf8} = 1;
my $s = $dbh->selectall_arrayref($q)->[0][0];
print utf8::is_utf8($s) ? "utf8": "not utf8", "\n";
print Encode::encode_utf8($s), "\n";
ところで、この pg_enable_utf8 は、取得した値のデータ型見て、text 型や varchar 型などの文字列型であれば utf8 フラグを付ける。その為以下のコードだと utf8 フラグは付かない。
my $q = "select 'あいうえお'";
何故かというと、明示的な型指定がない文字列リテラルは、PostgreSQL では unknown 型だからだ。