2012-04-27 62 views
0

我有一個使用PostgreSQL數據庫在perl和dojo中製作的網頁。我必須在數據庫中搜索availale人員,並且由於來自丹麥的im必須在搜索中提供字母æ,ø和å。我認爲這是使用UTF8時的標準,當我通常在PHP上通過mysql進行編程時,我並不認爲這會很難。PostgreSQL,Perl和dojo特殊字符問題(æ,ø和å)

我已經做好了每一個我知道把這個search_word轉換爲正確編碼的技巧,所以我可以在postgre sql數據庫中用æ,ø和å搜索正確的名字,但仍然失敗。

我有我的perl代碼進行獲取,但這個獲取返回0行,當我在psql終端插入相同的命令我得到46行返回(複製從「tail -f日誌終端」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數據庫可以有一定的編碼,我必須考慮到這一點?或者它可能有些完全不同?

希望有人能幫助我。我一直在努力,現在這個問題了兩天,因爲事情看起來他們應該,但不工作我得到一個有點傷感:/

問候, 雷神阿斯楚普佩德森

回答

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 

你不會說得很清楚,我想你最終打算髮送字符數據作爲JSON用於Dojo。您需要將它們編碼爲UTF-8八位字節;各種JSON庫將自動爲您處理,無需手動調用Encode函數。

+0

感謝您的回答。我認爲你是對的,但發現了生產環境。正在使用一些自定義轉換器的特殊字符,所以我的問題實際上不是一個問題,因爲我必須使用自定義編碼器/解碼器的字符......只是希望我的公司有人會告訴我,所以我沒有必要在沒有必要的事情上調試太久。再次感謝 :-) – 2012-05-14 11:50:44