2012-04-27 11 views
0

PostgreSQLデータベースを使用してperlとdojoで作成されたWebページがあります。私はデータベースのavailale人を検索しなければなりません。デンマークからは、æ、ø、åという文字が検索で利用可能になっている必要があります。私はこれがUTF8を使用しているときに標準であると思っていました。通常、mysqlを使ってphpでプログラムすると、それは難しいとは思いませんでした。PostgreSQL、perl、dojo特殊文字の問題(æ、ø、å)

このsearch_wordを適切なエンコーディングに変換するために私が知っているすべてのトリックを正しく行っているので、postgre sqlデータベースでæ、ø、åの正しい名前を検索できます。

私は私のperlコードを取得していますが、このフェッチは0行を返します。psql端末に同じコマンドを挿入すると、46行が返されます( "tail -f log terminal"からSTDERR文をコピーして挿入します)。

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

、あなたが見ることができるように私はSTDERRにSQL文を書くと、次の出力する:psqlのコマンドを介してデータベースに接続されている他の端末)に... perlのコードがある

[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はdojo.xhr.postを介して送信される "J%C3%B8rgen"からUTF8エンコーディングを変換するので、それはSQLステートメントで?それはpsqlデータベースが特定のエンコーディングを持つことができるからです。何とかそのことを考慮する必要がありますか?それとも、まったく違うものかもしれませんか?

誰かが私を助けることを願っています。私は今、2日間、この問題で苦労して物事ので、彼らが必要のように見えますが、私は少し悲しい取得動作しませんされています:/

あなたはおそらくに忘れてしまったよろしく、 トールAstrupペダーセン

答えて

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関数を手動で呼び出す必要はありません。

+0

お返事ありがとうございます。私はあなたが正しいと思うが、生産環境を見つけた。特別なcharctersのためのいくつかのカスタムコンバータを使用しているので、私の問題は実際には私は文字のカスタムエンコーダ/デコーダを使用する必要があるので、最初の問題はなかった...ちょうど私の会社では、私は、必要でないものについては、長い間デバッグする必要はありませんでした。再度、感謝します :-) –