• ベストアンサー

Perlでの文字コード変換

Windowsのフォルダに入っているファイル名をFedora Coreに入ってるpostgresのtableに入れたいのですが(perlで実行)文字の変換の仕方がわからず以下のメッセージが出て止まってしまいます。 DBD::PgPP::st execute failed: ERROR: invalid byte sequence for encoding "EUC_JP": 0x96d8 良い方法があれば教えてください。 **************************************** $query0 = 'insert into aaatbl (filename) values("$aaa"); $sth = $dbh->prepare("$query0"); $sth->execute; $sth->finish; ($query0 が S-JISでaaatblはECU-JP)

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • rafysta
  • ベストアンサー率45% (24/53)
回答No.1

デフォルトで入っているEncodeを使って以下のように変換してみては? use Encode qw/ from_to /; $query0 = 'insert into aaatbl (filename) values("$aaa"); &from_to($query0, 'shiftjis', 'euc-jp' ); $sth = $dbh->prepare("$query0"); $sth->execute; $sth->finish;

drdrdrdr
質問者

お礼

おかげで解決しました。 ありがとうございました。

関連するQ&A

  • 文字セットの変換

    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+mysqlで変数が使えなくて困ってます。

    use DBI; $id=1; $nm="gootarou"; $mm="friend"; $user = '***'; $passwd = '***'; $db = 'DBI:mysql:***'; $dbh = DBI->connect($db, $user, $passwd); $sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ($id,$nm,$mm)"); $sth -> execute; $sth -> finish; $dbh -> disconnect; exit; mysqlの勉強を始めたところでいきなり壁にぶちあたってしまいました^^; googleその他で検索かけてみましたが解決に至りませんでしたので 質問させてください。 >$sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ($id,$nm,$mm)"); ↑ここの部分を >$sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ('1','gootarou','friend')"); と直接入力してやれば問題なく登録されるのですが、変数を使うと正常に処理がされません。 数字を変数に代入したものは大丈夫なのですが 英字や二バイト文字を変数に代入したものが問題あるようです。 それぞれのフォームの型はvarchar(100)で設定しています。 ループで一括処理したいのですが変数が使えないことには・・と困ってます。 よろしくお願いします。

  • 未だ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.

  • perlでdb(mysql)に接続

    perlでdb(mysql)に接続し、取得したデータを 表示させるというようなことをしたいのですが、うまく いきません。 ファイル名test.cgi mysqlのバージョンは 5.0.45で 記述は以下です。 #!/usr/bin/perl use DBI; my $dbh = DBI->connect("DBI:mysql:database, "userid", "password"); my $sth = $dbh->prepare('SELECT * FROM tablename'); $sth->execute; print "Content-Type: text/plain\n\n"; print "\n"; while(my @row = $sth->fetchrow_array) { print "$row[0]:$row[1]\n"; } $sth->finish(); $dbh->disconnect(); exit; ブラウザで確認すると何も表示されず、ログとして 以下のエラーが確認できます。 DBD::mysql::st execute failed: Table 'database.tablename' doesn't exist at test.cgi line 8. DBD::mysql::st fetchrow_array failed: fetch() without execute() at test.cgi line 11. my $sth = $dbh->prepare('SELECT * FROM tablename'); で指定したテーブルは存在しておりますし、SQL文の記述も 問題ないと思われます。 また、ファイルのパーミッションは705(755でも同様の結果)です。 perl初心者のため、どこが問題なのか検討がつきません。 ご助言いただきたく存じます。 よろしくお願いいたします!

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

    こんにちわ。先日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に内容を送ることが出来ません。宜しくお願いします

    #!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;

  • perlのプログラムでエラーが出ます。

    普段PHPerなんですがbatchの関係でperlを使用しなければならなくなり書いていたんですが、 下記のソースコードの中でINSERT INTOの部分でエラーが発生してしまいます。 最初selectしている部分はcreate tableで作っているテーブル構成と同じです。 それからサイト名に関するレコード部分は*で隠しています。 よろしくお願いいたします。 #!/usr/bin/perl use DBI; # データソース $d = 'DBI:mysql:a_anime'; # ユーザ名 $u = '************'; # パスワード $p = '************'; # データベースへ接続 $dbh = DBI->connect($d, $u, $p); $sth = $dbh->prepare("select * from tweet where tweetid BETWEEN '1' AND '21562745' limit 5"); $sth->execute; while( @row = $sth->fetchrow_array ){ $priduct_id = @row['3']; $user_url = @row['6']; $sth2 = $dbh->prepare("show tables from a_anime like 'tweet_@row['3']'"); $sth2->execute; @row2 = $sth2->rows; $sth2->finish; if (@row2 != 1){ $sth22 = $dbh->prepare("CREATE TABLE `tweet_@row['3']` ( `id` int(255) NOT NULL auto_increment, `userid` int(25) DEFAULT NULL, `text` text NOT NULL, `product_id` int(255) NOT NULL, `product_name` varchar(30) NOT NULL, `date` varchar(20) NOT NULL, `user_url` varchar(160) NOT NULL, `username` varchar(100) NOT NULL, `flag` int(1) NOT NULL DEFAULT '1', `rev_point` int(1) NOT NULL DEFAULT '1', `t_tweetid` bigint(255) DEFAULT NULL, `rev_id` int(10) DEFAULT NULL, `rev_flag` int(1) NOT NULL DEFAULT '0', `*****_flag` int(1) DEFAULT NULL, `res_info` int(100) DEFAULT NULL, `fav_info` int(255) DEFAULT NULL, `user_img` varchar(200) DEFAULT NULL, PRIMARY KEY (`id`), KEY `index3` (`flag`), KEY `user url` (`user_url`), KEY `t_tweetid` (`t_tweetid`), KEY `index4` (`flag`,`rev_point`,`product_id`), KEY `index5` (`flag`,`product_id`), KEY `index6` (`userid`,`flag`), KEY `index7` (`username`,`flag`), FULLTEXT KEY `index2` (`text`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8"); $sth22->execute; $sth22->finish; } $sth3 = $dbh->prepare("select user_url from tweet_@row['3']"); $sth3->execute; print "@row['3']\n"; print "@row['6']\n"; @row3 = $sth3->fetchrow_array; $sth3->finish; #if ($user_url != $row3){ print @row['2'] ; print "\n"; $sth4 = $dbh->prepare("INSERT INTO tweet_@row['3'] VALUES (@row['1'],@row['2'],@row['3'],@row['4'],@row['5'],@row['6'],@row['7'],@row['8'],@row['9'],@row['10'],@row['11'],@row['12'],@row['13'],@row['14'],@row['15'],@row['16'])"); print $sth4; print "\n"; $sth4->execute; $sth4->finish; } } $sth->finish; $dbh->disconnect;

  • PerlからMysqlに接続してデータを昇順?降順に並べる方法

    こんばんは。 現在、PerlからMysqlに接続してデータを昇順?降順に並べようと思っております。 しかし、降順に並べる場合、うまく動きません。 詳細を以下に明記しますので、どなたか宜しくお願いします。 テーブル名:test テーブル内のデータ:100個 まず、昇順の場合 少し省略しますが、まず接続します。 $dbh = DBI->connect($dsn,$user,$password); $sth = $dbh->prepare("SELECT * From test Order by no limit 5,2"); $sth->execute; $sth->finish; $dbh->disconnect; これで、no5から二つ(つまり、no5とno6のみ)が抽出されると思います。 降順の場合 $dbh = DBI->connect($dsn,$user,$password); $sth = $dbh->prepare("SELECT * From test Order by no desc limit 5,2"); $sth->execute; $sth->finish; $dbh->disconnect; こうすると、no6,no5という順に抽出されます。ちなみに、limit 5,2をlimit 5,3とすると、no6,no5,no4と抽出されます。なぜここでlimit 5,2の際にno5,no4でlimit 5,3の際にno5,no4,no3という順に抽出されないのか分かりません。 私がしたいのは、noを降順(no5,no4,no3・・・)という順に表示させたいのです。ただ、降順に表示させるのではなく、例えば上記でlimitで指定したように、あるnoから3つとかしたいのです。 質問が長くなり分かりにくいかも知れないのですが、どなたか力を貸していただけないでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • Mysqlの接続について

    現在、以下のようなperlのスクリプトを作っているのですが、mysqlへの接続,切断は以下の場合、どちらにした方がいいのでしょうか? (1)の場合 use DBI; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth = $dbh->prepare("SELECT no,title,name,date,host From `table1` where no='1'"); $sth->execute; $sth->fetchrow_array; $sth->finish; $sth2 = $dbh->prepare("SELECT no,title,name,date,host From `table2` where no='1'"); $sth2->execute; $sth2->fetchrow_array; $sth2->finish; $dbh->disconnect; (2)の場合 use DBI; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth = $dbh->prepare("SELECT no,title,name,date,host From `table1` where no='1'"); $sth->execute; $sth->fetchrow_array; $sth->finish; $dbh->disconnect; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth2 = $dbh->prepare("SELECT no,title,name,date,host From `table2` where no='1'"); $sth2->execute; $sth2->fetchrow_array; $sth2->finish; $dbh->disconnect; (1)の場合と(2)の場合の違いは、(1)の場合、最初にデータベースに接続して、一番最後に切断する事で、(2)の場合、毎回データベースへの接続と切断を行う事が違います。 (2)の場合、毎回接続と切断を行うので、2回ほどではあまり変わらないかもしれないのですが、もし10回とか接続と切断を行うとかなり負荷が高くなるような気がするのですが、他のHPなどを拝見すると接続をしたら切断を行うように癖をつけるようにした方がいいと書かれていたりします。 どちらの方が正しいやり方というか、負荷がすくなく使えるのでしょうか?

    • ベストアンサー
    • Perl
  • PerlでDBIを使いますが、結果セットをフィールド名でアクセスするには?

    OSはWindowsでAccess2002のデータベースをODBC経由でDBIを用いて、Perlからアクセスします。 以下のように、結果セットをフィールド名でアクセスしたいです。 可能でしょうか? #!/perl/bin/perl #!/usr/bin/perl -w use DBI; # create the DSN connection $dsn = "dbi:odbc:test"; $dbh = DBI->connect($dsn) or die "接続エラー"; $query = "select * from goods;"; # execute the query $sth = $dbh->prepare($query); $sth->execute(); print "no name price\n"; print "--------------------------------------\n"; while(@item = $sth-> fetchrow) { #print "@item[0] @item[1] @item[2]"; #----- 通常はこうだが、 print "$item{'goods_name'} $item{'goods_price'} $item{'auto_no'}"; #----こんな感じで利用したい。 print ("\n"); } # disconnect $sth->finish(); $dbh->disconnect(); exit; __END__

    • ベストアンサー
    • CGI