- 締切済み
文字化けしてしまって困っています
postgresのデータベースから日本語の入った列の取得が上手くできずに困っています。 どうすればよいのでしょうか。。。 【DB】 postgres:9.1.1 perl: v5.10.1 databaseの文字コード:UTF-8 【クライアント】 postgres:8.4.0 perl:v5.8.8 文字コード:ECU-JP このような環境で、クライアントで 県名テーブルから県名を取得する以下のようなperlを実行した結果、 OUT.csvの県名列が文字化けしてしまったため (1)のように修正したのですがエラーとなってしまいます。 convertの記述の仕方が悪いのでしょうか? DBD::Pg::st execute failed: ERROR: function convert(character varying, unknown, unknown) does not exist at character 19 (Test.pl) #!/usr/local/bin/perl use DBI; $query = <<EOF; SELECT KEN_ID, KEN_NAME ←修正前 convert(KEN_NAME,'UTF-8','EUC-JP')←(1) FROM KEN_MASTER EOF $dbi = DBI->connect("dbi:Pg:dbname=datbase;host=DATA_SV","hogeUser","hogePass"); $dsi = $dbi->prepare($query); $dsi->execute(); open(OUT, "> /OUT.csv"); while ($shr = $dsi->fetchrow_arrayref) { print OUT join(",", @$shr), "\n"; } close(OUT); $dsi->finish(); $dbi->disconnect(); exit();
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- root139
- ベストアンサー率60% (488/809)
CLIENT_ENCODING を指定して PostgreSQL 側で自動文字コード変換させれば良いのでは? Perlスクリプト側や個々のSQLで文字コード変換をするより楽かと。 例) ------------------------------------------ $query = 'SELECT KEN_ID, KEN_NAME FROM KEN_MASTER'; # ↑個々のSQLに変換処理は必要なし。 $dbi = DBI->connect(・・・ $dbi->do("SET CLIENT_ENCODING TO 'EUC_JP';"); # ← この行を追加 $dsi = $dbi->prepare($query); $dsi->execute(); ---------------------------------------------- http://www.postgresql.jp/document/9.1/html/multibyte.html#AEN32085 http://www.postgresql.jp/document/9.1/html/runtime-config-client.html#GUC-CLIENT-ENCODING
- kmee
- ベストアンサー率55% (1857/3366)
convert(KEN_NAME,'UTF-8','EUC-JP') と言う文字列がそのままSQLに渡されているように見えます。 そのため、「convert等という関数は知らない」とDBからエラーが返ってきているのでは? この場合、KEN_NAME はカラムの名前で、「KEN_NAME」ってそのままで変換の必要はありません。 変換が必要なのは、読み出した後です。 print OUT join(",", @$shr), "\n"; この部分が出力ですから、その出力している文字列を変換する必要があります。 convertは、どのconvertでしょう? 普通のjcode.plなら、utf8は使えません。 Perl 5.8.8なら、今後のことを考え、Encode::from_toを使うのがよいでしょう。(use Encde;が必要) convertもEncode::from_toも、文字列を直接書き変えます。 my $st=join(",", @$shr), "\n"; Encode::from_to($st, 'utf-8','euc-jp'); print OUT $st ; ほかにも、いろいろとありますので、「Perl Encode」で検索して、いろんな資料に目を通してください。