我有一個使用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數據庫可以有一定的編碼,我必須考慮到這一點?或者它可能有些完全不同?
希望有人能幫助我。我一直在努力,現在這個問題了兩天,因爲事情看起來他們應該,但不工作我得到一個有點傷感:/
問候, 雷神阿斯楚普佩德森
感謝您的回答。我認爲你是對的,但發現了生產環境。正在使用一些自定義轉換器的特殊字符,所以我的問題實際上不是一個問題,因爲我必須使用自定義編碼器/解碼器的字符......只是希望我的公司有人會告訴我,所以我沒有必要在沒有必要的事情上調試太久。再次感謝 :-) – 2012-05-14 11:50:44