Perl DBI でSELECT ilikeの結果がうまくでない

このQ&Aのポイント
  • PerlからDBIを使用して商品の列挙を行う際、入力ワードによって結果が正しく得られない問題が発生しています。
  • psqlでは問題なく正しい結果が得られるため、Perlからのクエリーに問題がある可能性があります。
  • 特に英数字を含むワードに対して問題が発生しており、'%A-101BX%'のようなワードでは正しい結果が得られません。
回答を見る
  • ベストアンサー

Perl DBI でSELECT ilikeの結果がうまくでない

入力したワードを含む商品の列挙をしたいのですけどpsqlで直接たたくとうまく結果がでるのにPerlからDBIを使用した場合は入力ワードによってうまくできたりできなかったりします。どうしたらうまくいくのでしょうか? DBはEUC-JP PerlからのクエリーもEUCにJcode変換してから行っております。 なおうまく出ないのは漢字ではなく英数字をワードにしたものです。 SELECT * FROM 商品テーブル WHERE 商品名 ilike '%入力ワード%' 商品名が**** A-101ABXの場合 '%A-%'ではうまくいくけど'%A-101BX%'ではうまくいかない。 (****は任意の漢字、英数字) どうぞよろしくお願いします。

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

  • ベストアンサー
  • zebedeer
  • ベストアンサー率66% (80/121)
回答No.4

以下のコードの実行結果はどうなりますか? (実際の結果と、期待する結果の両方を教えてください) $\="\n"; $sth = $dbh->prepare('select name from testtbl where name ilike ?') || die $dbh->errstr; $sth->execute('%A99B-6%') || die $sth->errstr; while ($name = $sth->fetchrow_arrayref()) { last if $dbh->errstr; print @{$name}; } print '$dbh->errstr:'.$dbh->errstr if $dbh->errstr; print '$sth->rows:'.$sth->rows;

linacat
質問者

お礼

解決しました。教えて貰ったコードを実行してみて判ったのですが、実際のコードでは取得した結果は一旦配列に落とし最後に加工して出力するのですがその出力の部分が間違えておりました。 てっきりDBとのアクセス部分と思い込んでおりました。 どうもすみませんでした。 いろいろご教授ありがとうございました。おかげさまで解決できました。

その他の回答 (3)

  • zebedeer
  • ベストアンサー率66% (80/121)
回答No.3

>文字コードの問題かと思う 半角英数のみの場合は必ず上手くいきますか? もしそうなら、入力コードを変更すると正しく検索に失敗しますか? (Shift_JIS等の検索文を流すと正しく一致しませんか?)

linacat
質問者

補足

たびたびすみません。なんどか確認しましたらどうもマイナス以降おかしくなるようでしてたとえば'A99B-101'を'%A99B-%'で結果がでるのに対して'%A99B-6%'では出なくなります。全ての場合でマイナスを境に結果が出なくなるようなんです。文字コードの問題とも思いEUC,SJISともに変換を試してみても結果は変わらずでした。 インターフェース以降で何かおかしくなっているのでしょうか・・・? 参考までにPerlのコードを記述しておきます。 $sql = "select name from testtbl where name ilike '%A99B-6%'"; &jcode'convert(*sql, "euc"); $sth = $dbh->prepare($sql) || die $dbh->errstr; $sth->execute() || die $sth->errstr; while (($name) = $sth->fetchrow_array()) { print "$name\n"; } どうぞよろしくお願い致します。

  • zebedeer
  • ベストアンサー率66% (80/121)
回答No.2

とりあえず、そういった状況に陥った経験が無いので何ともですが、hoge like '%A-101%'やhoge = '**** A-101ABX'等での結果は正常ですか? (他の単純なsql文でも検索結果は異常ですか?)

linacat
質問者

補足

試してみましたらperlからの問い合わせでhoge = '**** A-101ABX'での結果は出ませんでした・・・・ ちなみにコンソールから直接同じクエリーを発行すると間違いなく1件ヒットします。 文字コードの問題かと思うのですがそれを確かめる手立てがわかりません。何かよい方法がありましたらご教授下さい。

  • zebedeer
  • ベストアンサー率66% (80/121)
回答No.1

>**** A-101ABX >**** A-101BX 検索条件が一致していませんが。。。 (普通に見てもlikeじゃないです)

linacat
質問者

補足

すみませんタイプミスです。'**** A-101AB'でした。 これは一例なんですけどpsqlでは問題なく出るものがDBI経由だとうまくいかないのです。

関連する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;

  • ppmでDBIがインストール出来ません。

    WinXP上のPerlでMySQLをやろうと思ったのですが、ppmからのDBIインストールがうまく行きません。 普通に「ppm install DBI」では出来なくて、プロキシサーバ名とかが良く分からなかったので http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/ からDBI.zipを直接ダウンロードし、解凍したフォルダ上で ppm install DBI.ppd を実行した所、 Error installing package 'DBI.ppd': Read a PPD for 'DBI.ppd', but it is not intended for this build of Perl (MSWin32-x86-multi-thread) と言うエラーが出てインストール出来ませんでした。 ちなみにPerlは-Vオプションで次のように表示されます。 ------------------------------------------------ This is perl, v5.6.1 built for MSWin32-x86-multi-thread (with 1 registered patch, see perl -V for more detail) Copyright 1987-2001, Larry Wall Binary build 632 provided by ActiveState Corp. http://www.ActiveState.com Built 03:40:44 Jun 3 2002 ------------------------------------------------ ビルドが6xxなのでこのDBI.zipで良いと思うのですが…何かおかしいのでしょうか? あと、私はPerlをC:\PerlでなくC:\usr\localに入れているのですが、これがまずいのでしょうか? どなたか心当たりのある方がいましたら、よろしくお願いします。

  • DBI:Spriteについて

    ●Perl DBI:Spriteが使いたくて DBD-Spriteをインストールしました。 DBD-Sprite-0.50 WindowsXP上で、VC++6.0 Perl5.6 DBIはインストールしています。 $dbh = DBI->connect("DBI:Sprite:testdb.txt",'','') 初歩的なことですが、以下の行でエラーが発生します。 Invalid username/password! at C:/usr/site/lib/DBD/Sprite.pm line 199. DBI connect('testdb.txt','',...) failed: at test.pl line 39 dbih_getcom given an undefined handle (perhaps returned from a previous call which failed) at test.pl line 39. "DBI:Sprite:testdb.txt"のtestdb.txtは testdb.txtというファイル名です。 ユーザーは ''と パスワードは ''です。 何かよい情報はありますか?

    • ベストアンサー
    • Perl
  • PerlでUTF8をEUCに変換

    こんにちは、お力を貸して下さい。 OSX上で日本語のファイル名を取得し そのファイル名をeucに変換しようとすると 半濁音付きのカナが文字化けを起こしてしまうのです。 Web上で “$euc = Jcode($euc, 'utf8')->z2h->h2z->euc;” で、できないこともないみたいだったので、さっそくやってみたんですが… 変換したいファイル名は、「1ドキュメント」とします。 -------------------------------------- #!/usr/bin/perl use strict; use Jcode; my $path = "パスがはいっている"; my @files; opendir DIR, $path; @files = grep /^1/ && -f "$path/$_", readdir(DIR); closedir DIR; foreach (@files) { my $euc = $_; $euc = Jcode->new($euc, 'utf8')->z2h->h2z->euc; print "$euc\n"; } exit; -------------------------------------- 結果:1ト〓キュメント やっぱり文字化けしましたTT 新しい解決法がありましたら、よろしくお願いします。

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

    Perlで全角英数字を半角英数字に変換させたいのですが、 Jcodeを使わずにできる方法を教えてほしいです。 例えば zenkaku→zenkaku のようにです。 $value=~ s/$a\xA3([\xB0-\xB9\xC1-\xDA\xE1-\xFA])$b/pack("C", ord($1) - 0x80)/oeg; こういうのを試してみたのですが、上手く行きませんでした・・・

    • ベストアンサー
    • Perl
  • フォーム入力のチェック

    フォームの入力をCGI(Perl)でチェックするとき、 全角の漢字、カタカナ、ひらがなでの入力以外は禁止にしたいです。 どなたかいい方法をご存知でしょうか? とりあえず、現在は、 jcode.plで全角英数字⇒半角英数字に変換 フォームに入力された文字列を一文字(半角2文字)ずつ抽出して、 $a=~ s/([^\w ])/'%' . unpack("H2", $1)/eg; でエンコードしたものが%を含んでいるかどうかで判別してます。 でもこれだと全角英数字と半角英数字しかシャットアウトできません。 記号文字なども入力出来ないようにしたいです。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • Perl初心者です。MySQLから取得したデータをXMLで出力させたいです。

    以下のようにしましたがXMLのエンコードを euc-jp にするときちんと表示されますが、utf-8 にするとダメです。 助言をお願いします。cgiファイルとDB(MySQL)の文字コードはEUC-JP、Perlのバージョンは5.6です。 #!/usr/local/bin/perl use DBI; use Jcode; $sqlStr = "SELECT * FROM Test"; $x = "Content-type: text/xml; charset =utf-8\n\n"; # utf-8 $x .= "<\?xml version=\"1.0\" encoding=\"utf-8\"\?>\n\n"; # utf-8 $x .= "<ROOT>"; $dbh = DBI->connect ("DBI:mysql: AAA: localhost","BBB","CCC "); $sth = $dbh->prepare("$sqlStr"); $sth->execute; $num_rows = $sth->rows; $num_fields = $sth->{NUM_OF_FIELDS}; for ($i=0; $i<$num_rows; $i++) { $x .= "<ROW>"; @a = $sth->fetchrow_array; for ($n=0; $n<$num_fields; $n++) { $a[$n] =~ s/&/&amp;/g; $a[$n] =~ s/</&lt;/g; $a[$n] =~ s/>/&gt;/g; $col = $sth->{NAME}->[$n]; $x .= "<$col>$a[$n]</$col>"; } $x .= "</ROW>"; } $sth->finish; $dbh->disconnect; $x .= "</ROOT>"; Jcode::convert(\$x,'euc','utf8'); # utf-8 print $x; exit;

    • ベストアンサー
    • Perl
  • 漢字、カタカナ、ひらがな、英数字の判定

    perl5.8.5でCGIのプログラムを作っています。 入力された文字(2バイト文字)が「漢字」「カタカナ」「ひらがな」「英数字」「その他」のどれなのか文字種類を判定したいと思っています。 プログラムの文字コードはEUCで書いています。 よろしくお願いします。

  • 機種依存文字(株)のコード変換について

    perlのバージョンがあがった関係で、jcode.plをJcode.pmに対応する為に記述方法の変更に奮闘中です 機種依存文字(株)に関してうまくいかないようで、下記のように文字化けしてしまいました 例1) $a="あ(株)";->あ+機種依存文字(株) Jcode::convert(\$a,'euc'); print"$a"; ->あ? 例2) $a="あ(株)";->あ+機種依存文字(株) $a= jcode($a)->h2z->euc; print"$a"; ->あ? 例3) $a="あ(株)";->あ+機種依存文字(株) $a = Jcode->new($a,"euc")->tr("あ","わ")->h2z->euc; print"$a"; ->わ? 各記述の後、$a内の機種依存文字(株)は?になってしまいます 機種依存文字(株)としてそのまま認識したいのですが、どのような記述にすればいいのかわかりません (機種依存文字(株)以外の文字化けはまだ調べていません) ※perl5.8.7では認識されず、以前のperlのバージョン5.005_03ではそのまま認識されています ご教授宜しく御願いします

    • ベストアンサー
    • Perl
  • 文字コードでハマル

    仕様という文字がd様って表示されますので、 sjisからeucにコンバート require 'jcode.pl'; $a = "仕様"; &jconv::convert(*a, "euc"); 正しく表示されません。 Perlに詳しくないのですが*aとする理由は何でしょうか?

    • ベストアンサー
    • CGI