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日間苦労してきました.
よろしく、トール・アストルプ・ペダーセン