プロが教える店舗&オフィスのセキュリティ対策術

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();

A 回答 (2件)

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/multi …
http://www.postgresql.jp/document/9.1/html/runti …
    • good
    • 0

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」で検索して、いろんな資料に目を通してください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す