0

PostgreSQL データベースを使用して perl と dojo で作成された Web ページがあります。データベースで利用可能な人を検索する必要があります。私はデンマーク出身なので、文字æ、ø、åが検索で利用できる必要があります。UTF8 を使用している場合はこれが標準であると考えていましたが、通常、mysql を介して php でプログラムする場合、それほど難しいとは思いませんでした。

このsearch_wordを正しいエンコーディングに変換するために知っているすべてのトリックを適切に実行したので、postgre sqlデータベースでæ、ø、およびå...で正しい名前を検索できますが、それでも失敗します。

フェッチを行うPerlコードがありますが、このフェッチは0行を返し、psqlターミナルに同じコマンドを挿入すると、46行が返されます(「tail -f log terminal」からSTDERRステートメントをコピーし、接続されている別のターミナルに挿入しますpsql コマンドを介してデータベースに)... perl コードは次のとおりです。

sub dbSearchPersons {
  my $search_word = escapeSql($_[0]);
  $search_word = Encode::decode_utf8($search_word);

  $statement = "SELECT id,name,initials,email FROM person WHERE name ilike '\%".$search_word."\%' OR email ilike '\%".$search_word."\%' OR initials ilike '\%".$search_word."\%' ORDER BY name ASC";
  $sth = $dbh->prepare($statement);
  $num_rows = $sth->execute();

  print STDERR "Statement: " . $statement;
  if($num_rows > 0){
    $persons = $dbh->selectall_hashref($statement,'id');
  }

  dbFinish($sth);
  webdie($DBI::errstr) if($DBI::errstr);
}

ご覧のとおり、SQLステートメントをSTDERRに記述し、次を出力します。

[Fri Apr 27 11:24:26 2012] [error] [client 10.254.0.1] Statement: SELECT id,name,initials,email FROM person WHERE name ilike '%Jørgen%' OR email ilike '%Jørgen%' OR initials ilike '%Jørgen%' ORDER BY name ASC, referer: https://xx.xxx.xxx.xx/cgi-bin/users.cgi

私が正しく書いたSQL(上記の端末出力から確認できるように)。端末からステートメントをコピーして貼り付け、psql端末に直接挿入すると、必要に応じて46行が返されます...しかし、 perl はまだ行を返しません。

理解できません?「ø」ではなく「ø」を表示するように文字列をフォーマットする場合 (perl が UTF8 エンコーディングを dojo.xhr.post 経由で送信される「J%C3%B8rgen」から変換するため)、使用できないはずです。それはSQL文で?psqlデータベースには特定のエンコーディングを含めることができるため、何らかの方法でそれを考慮に入れる必要がありますか? それとも、まったく異なるものでしょうか?

誰かが私を助けてくれることを願っています。私はこの問題に2日間苦労してきました.

よろしく、トール・アストルプ・ペダーセン

4

1 に答える 1

3

するのを忘れていたのでしょうpg_enable_utf8。データベース インターフェイスは、Perl 文字データを返します。

$ createdb -e -E UTF-8 -l en_US.UTF-8 -T template0 so10349280
CREATE DATABASE so10349280 ENCODING 'UTF-8' TEMPLATE template0 LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';

$ echo 'create table person (id int, name varchar, initials varchar, email varchar)'|psql so10349280
CREATE TABLE

$ echo "insert into person (id, name) values (1, 'Jørgensen')"|psql so10349280
INSERT 0 1

$ echo 'select * from person'|psql so10349280
 id |   name    | initials | email
----+-----------+----------+-------
  1 | Jørgensen |          |

$ perl -Mutf8 -Mstrictures -MDBI -MDevel::Peek -E'
    my $dbh = DBI->connect(
        "DBI:Pg:dbname=so10349280", $ENV{LOGNAME}, "", { RaiseError => 1, AutoCommit => 1, pg_enable_utf8 => 1}
    );
    my $r = $dbh->selectall_hashref("select * from person where name = ?", "id", undef, "Jørgensen");
    Dump $r->{1}{name};
'
SV = PV(0x836e20) at 0xa58dc8
  REFCNT = 1
  FLAGS = (POK,pPOK,UTF8)
  PV = 0xa5a000 "J\303\270rgensen"\0 [UTF8 "J\x{f8}rgensen"]
  CUR = 10
  LEN = 16

あなたははっきりとは言いませんが、最終的には Dojo で使用するために文字データを JSON として送信するつもりだと思います。それらを UTF-8 オクテットにエンコードする必要があります。さまざまな JSON ライブラリが自動的に処理してくれるので、Encode関数を手動で呼び出す必要はありません。

于 2012-04-27T13:56:10.000 に答える