• 締切済み

文字化けしてしまって困っています

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

みんなの回答

  • root139
  • ベストアンサー率60% (488/809)
回答No.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/multibyte.html#AEN32085 http://www.postgresql.jp/document/9.1/html/runtime-config-client.html#GUC-CLIENT-ENCODING

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

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

関連するQ&A

  • postgresに内容を送ることが出来ません。宜しくお願いします

    #!c:/perl/bin/perl -- こんにちわ。perl5.8,windowsXP,postgreSQL8.2を使って居ります。postgresにperlから内容を入力できず困っております。今回入力するテーブルには既にsqlに直接行を2行分のみ入力してあり、その部分、3行目からはperlでテストしています。postgresのpg_logというフォルダにログが入っていたので見たのですが特にエラーも書いてありませんし、コマンドプロンプトでもエラーにはなっていませんでした。アドバイスをお願いします。宜しくご指導下さい。 use DBD::Pg; use DBI; require'jcode.pl'; $dbh=DBI->connect("dbi:Pg:host=localhost;dbname=kensaku",'dd','ee'); my$b=(<<"EOL"); convert('PostgreSQL' using sjis_to_euc_jp); insert into kensaku(id,word1,word2,word3,head,img) values(?,?,?,?,?,?); EOL ; @bindvalues=('w','d','q','g','c','v'); &jcode'convert(*bindvalues,'euc_jp'); $sth=$dbh->prepare($b); foreach (@csvdata){ @bindvalues=split(/,/,$_); $v=$sth->execute(@bindvalues);} $d=$dbh->disconnect;

  • データベースにアクセス出来ません。宜しくお願いします。

    こんにちわ。先日postgre8.2をwinXPにダウンロードしました。デpostgresの画面ではデータベースの新規作成が出来るようになっているのですが、パールから作ろうとするとコマンドプロンプトにエラーが出てきます。以下にパールの文とエラーを書きますので、何かチェックする点や設定など確認や文自体の間違いなどお教え下さい。宜しくお願いします。 #!c:/perl/bin/perl use DBD::Pg; use DBI; $dbh=DBI->connect("dbi:Pg:host=localhost;dbname=postgres",'ddd','cc'); $sth=$dbh->prepare($a); my$a=(<<"EOL"); CREATE DATABASE kensaku with encoding='euc_jp' owner=ddd template=postgres tablespace=pg_default; grant all on database kensaku to public; EOL $v=$sth->execute(); $d=$dbh->disconnect; エラー:DBD::Pg::st execute warning: at test.pl line 21. 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 未だpostgresにアクセス出来ません。教えて下さい。

    こんにちわ。windowsXP,postgres8.2,perl5を使用して居ります。 postgresにperlからアクセスし、既存のテーブルの行に値を入れたいのですが、 valuesに数字以外の文字を指定するとpostgresに文字列が認識されません。教えて頂きたいことは、 仮に数字を6行目の$に入れると認識されるのですが、文字だと出来ないのは、どうしてでしょうか。$id='○○'と 文字を入れてみるとpostgresには1の結果だけが入ってきました。どのようにしたら良いかと、 思いprint'○○',$idとしてみました。すると下記のプロンプトでのエラーがでました。 構文が間違えていると思うので、良い方法があったら教えて下さい。宜しくお願いします。 #!c:/perl/bin/perl use DBD::Pg; use DBI; require'jcode.pl'; $dbh=DBI->connect("dbi:Pg:host=localhost;dbname=kensaku",'windws','aaaa')||die $dbh->errstr; print'9',$id;print'山田',$word1;print'd',$word2;print'w',$word3;print'c',$head;print'a',$img; @bindvalues=($id,$word1,$word2,$word3,$head,$img); &jcode::convert(*bindvalues,'euc'); my$b=(<<"EOL"); insert into kensaku(id,word1,word2,word3,head,img) values($id,$word1,$word2,$word3,$head,$img) EOL ; $sth=$dbh->prepare($b)||die $dbh->errstr; $sth->execute()||die $sth->errstr; $dbh->disconnect; $sth=$dbh->prepare($b)||die $dbh->errstr; $sth->execute()||die $sth->errstr; $dbh->disconnect; コマンドプロンプトのエラー DBD::Pg::st execute failed: ERROR: syntax error at or near "," at character 103 at test.pl line 19. ERROR: syntax error at or near "," at character 103 at test.pl line 19.

  • 特定文字での文字化け

    DB(oracle)から抽出したものをPerl5でcsv出力しているのですが、特定文字で文字化けが起こってしまいます。 特定文字というのが、シフトJISの「拡張文字」と言われているものにあたるらしく、 0xED40~0xED9Eとか0xFA40~0xFA9Eとかです。 0xED40→ス、0xED9E→シ、0xFA40→。、0xFA9E→.となってしまいます。(文字を出したかったのですが、表示されなかったので文字コードにしました。) $strをDBより抽出した文字列として jcode::convert( \$str, "euc" ); : :(文字列の区切り処理) : jcode::convert( \$str, "sjis" ); ということをやっています。 以前、 &jcode'convert( $str, "euc" ); : :(文字列の区切り処理) : &jcode'convert( $str, "sjis" ); とやっていたのですが、この場合、 「半角カナ+文字コードが7cを含む文字」 が文字化けを起こしていました。 これを修正するために前者のような修正をしたのですが、 間違っているのでしょうか? すみませんが、よろしくお願いします。

  • activeperlでDBD-Pgを扱うと、perlが強制終了する

    まず環境です。 -----[os環境]---------------- windows xp sp2 -----[active perlバージョン]- This is perl, v5.8.7 built for MSWin32-x86-multi-thread -----[cpan環境]-------------- ppm> properties DBI ppm> properties DBD-Pg で結果表示あり(インストール済みと判断) -----[PostgreSQLの環境]------ psql -U postgres -h localhost bookmark ユーザ postgres のパスワード:postgres ログイン可能でDB環境正常と判断。 の環境で、以下のスクリプトを実行すると、perlが強制終了します。 ------[test.pl]-------- #! /usr/bin/perl use DBI; $dbname = "worple"; $user = "postgres"; $passwd = "postgres"; $host = "localhost"; #DBオープン $db = DBI->connect("DBI:Pg:host=$host;dbname=$dbname", $user, $passwd) || die "DBI connect failed : $DBI::errstr"; #DBクローズ $db->disconnect; 1; ---------------- エラーメッセージがでることもなく、googleでも似た症状を探せないでいます。 何かヒントや、参考のURLでもいいのでお教え下さい。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 文字セットの変換

    perlCGIでperlDBIからPostgreSQLに接続してデータを文字セットをUTF-8に変換して表示するプログラムを作成していますが、この度、新サーバに移設したところ文字変換がうまくいかないようです。 これまでは、文字セット変換は、 $ENV{'PGCLIENTENCODING'} = 'UTF-8'; でうまく作動しておりましたが、新サーバではだめなようです。 そのため $dbh = DBI->connect("DBI:Pg:dbname=$dbname", "$dbusr", "$dbpas") || die &error(not_connect); $sth = $dbh->prepare( "SET client_encoding TO 'UTF-8' ") || die &error(not_prepare); $sth->execute() || die &error(not_execute); $sth->finish || die &error(not_finish); で変換を試してみましたがこれもだめでした。 なにが原因なのか分かりません。 ご回答をよろしくお願いします。 新サーバの環境は、 OS:Debian sarge PostgreSQL7.4.7 DBI 1-46 DBD 1-41 perl 5.8 です。

  • PerlからのCSV出力

    Perl初心者です。 PerlでOracleに接続し、結果をCSVを出力したいのですが 下記プログラムだとなにも出力されません。 Oracle10g OS:Linux *** #!/user/bin/perl # # # DBI モジュールの読み込み use DBI; #接続 my $hDb = DBI->connect("dbi:Oracle:dbname", "user/pass") or die "CONNECT ERROR $DBI::errstr"; #SELECT # $hSt = $hDb->prepare("SELECT ID,NAME FROM MASTER"); open(OUT, ">data.dat"); #実行 $nRes = $hSt->execute; #データの取得 while($raRes = $hSt->fetchrow_arrayref) { print OUT join(",", @$raRes), "\n"; } # ファイルクローズ close(OUT); $hSt->finish; $hDb->disconnect;

  • perlからDBIを使用したpostgresへの接続でエラー

    perlからDBIを使用して、データベースにアクセスしたいと思っていますが、connectで下記のようなエラーが出力され接続できません。 ↓↓↓↓↓↓apacheのエラーログ↓↓↓↓↓↓↓ DBI connect('dbname=[mscdb]','[postgres]',...) failed: FATAL: database "[mscdb]" does not exist at /web/member/cgi-bin/dbitest.pl line 8 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ mscdbがないとエラーが出力されているように思いますが、mscdbは存在します。どういった原因が考えられるでしょうか? プログラムには以下のように記述しています。 #!/usr/bin/perl use DBI; use constant DBNAME => 'DBI:Pg:dbname=[mscdb]'; use constant DBUSER => '[postgres]'; use constant DBPASS => '[××××]'; DBI->connect( DBNAME, DBUSER, DBPASS, { AutoCommit => 0 }); print "Content-Type: text/plain\n\n"; print $DBI::errstr? $_: 'Done'; 環境は以下の通りです。    perl v5.8.2    postgres v8.1.2 vine linux dbd v1.49

    • ベストアンサー
    • Perl
  • MySQLに登録すると文字化け

    Perlのスクリプトで、MySQLにユーザー情報を登録しているのですが、 二つのDBに登録しています。 一つ目のDBはEUC-JPで、もう一つがUTF-8のMySQLになっています。 具体的には、最初はあるCMSのユーザー登録を別のPerlスクリプトで行い正常に保存されていたのですが、今年の春頃からWordpressも使う必要があり、そちらがUTF-8のDBなのです。 英数字なら問題なく登録可能なのですが、日本語が入ると、UTF-8のDBでは文字化け等が発生して、正常に登録されませんでした。 ちなみに、Perlスクリプト自体はEUC-JPで記述・保存されているファイルなのですが、先述の通り、先のCMS側のDBがEUC-JPなので、このPerl自体をUTF8にするわけにもいかず・・・ 以下のようなソースになっています。 ------------------------------------------------------------------------ # データベースへアクセス $dbh = DBI -> connect ("DBI:mysql:$dbname:$dbhost",$dbusername,$dbpassword) or show_ErrorPage('データベースにアクセス出来ません。'); #$dbh->do("set names utf8"); #$data{'username'} = decode('utf8', $data{'username'}); #$data{'username'} = encode("shiftjis",decode("euc-jp",$data{'username'})); #$data{'username'} = encode("euc-jp",decode("utf8",$data{'username'})); #$data{'username'} = Encode::from_to($data{'username'}, 'utf8', 'euc-jp'); #utf8::decode($data{'username'}); #$data{'username'} = Encode::from_to($data{'username'},'euc-jp','utf-8'); $sth = $dbh->prepare( qq{ INSERT INTO $table2 (ID,user_login,user_pass,user_nicename) VALUES("$rows[0]", "$data{'username'}","$data{'password'}", "$data{'username'}") } ); $sth -> execute() or show_ErrorPage("データベースを実行出来ませんでした。$DBI::err ($DBI::errstr)"); $sth -> finish(); $sth2 = $dbh->prepare(qq{ SELECT ID FROM $table2 WHERE user_login = "$data{'username'}"}); $sth2 -> execute() or show_ErrorPage("データベースを実行出来ませんでした。$DBI::err ($DBI::errstr)"); @rowss = $sth2->fetchrow_array; $sth2 = $dbh->prepare( qq{ INSERT INTO $table3 (user_id,meta_key,meta_value) VALUES ("$rowss[0]","first_name",""), ("$rowss[0]","last_name",""), ("$rowss[0]","nickname","$data{'username'}"); $sth2 -> execute() or show_ErrorPage("データベースを実行出来ませんでした。$DBI::err ($DBI::errstr)"); ------------------------------------------------------------------------ 少し省いている部分もあり、数字等に間違いがあるかもしれません。 このPerlはフォームスクリプトで、$data{'username'}にユーザー名を入力してもらいます。 それを「user_login」や「user_nicename」に登録をしたいのですが、先のEUC-JPのDBでは問題ありませんが、UTF8のDBでは空白になります。 その後色々調べてみて、上記コードの#の部分を追加して試してみましたが、空白ではないものの文字化けになったり数字になって登録されてしまうようになりました。 やりたいことは、「$data{'username'}」という変数をUTF8に文字エンコードをしてWordpress側のDBに登録を行いたいのです。 その後「perl utf8 フラグ」などのキーワードを知り調べてみましたが、具体的に自分の知識では解決できずに悩んでおります。 もし宜しければご教示頂けますと幸いです。 宜しくお願い申し上げます。

  • CGI 文字化け

    CGIプログラムでうまく日本語が表示できません。 表示できても、余分な文字列が入ってしまいます。ソースは以下です。 #!/usr/bin/perl -w print "Content-type: text/html\n\n"; use DBI; use CGI; $q = new CGI; print $q->header; $no = $q->param('no'); $program= $q->param('program'); my $UDBNAME=""; my $USERNAME=""; my $USERPASS=""; my $db = DBI->connect("DBI:Pg:dbname=$UDBNAME",$USERNAME,$USERPASS); my $sth=$db->prepare(" select * from server where no = $no "); $sth->execute; my $num_rows=$sth->rows; if($num_rows <= 0){ print <<"_HTML_"; <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=ecu-jp"> </HEAD> <BODY> <TITLE>Server Search</TITLE> <img src = "http:///Logo.gif"> <BR> <HR width="90%"> <BR> <BR> 文字化け確認! <BR> <BR> <HR width="90%"> </HTML> _HTML_ 以上のようなプログラムをブラウザーで表示させると 先頭行に  Content-Type: text/html; charset=ISO-8859-1 と表示されてしまいます。文字化けはしないのですが、余計な Content-Type: text/html; charset=ISO-8859-1 はどうしたら取り除けるのでしょうか? ちなみにapacheの設定も AddLanguage ja .ja を先頭に LanguagePriority ja en ca cs AddCharset EUC-JP .euc-jp .cgi を先頭に のように設定しております。 もし、お分かりの方教えてください。

    • ベストアンサー
    • CGI