2013-08-29 36 views
1

我從一個新的和舊的ubuntu存儲庫中有一個標準的postgresql服務器。postgresql中國際字符的lower()函數

第一個是postgresql服務器8.3.12。這裏較低的()函數正常工作在丹麥字母「æ」

go=# select lower('Æ'); 
lower 
------- 
æ 
(1 row) 

現在上的Postgres 9.1.9功能不起作用(它返回相同的大寫字母)

go=# select lower('Æ'); 
lower 
------- 
Æ 
(1 row) 

不任何人有一個想法如何改變這種行爲?

(我的真正的問題是ILIKE不會對丹麥的人物無論是工作,但我認爲上面的例子會使問題更加清晰)

+0

你確定你還沒有遺漏什麼,它適用於sqlfiddle - http://sqlfiddle.com/#!1/d41d8/1253,版本9.1.9? –

回答

4

您的數據庫可能是用不同的語言環境中創建。

檢查\l+psql上的舊版本和新版本。他們會有不同的區域設置。

其他可能性是不同的操作系統/版本。 PostgreSQL使用libc的語言環境規則,並且一些平臺(特別是Mac OS X)有一些...特殊的... libc。

在9.1.9上的Fedora 19上運行的數據庫en_AU.UTF-8我得到:

regress=> select lower('Æ'); 
lower 
------- 
æ 
(1 row) 
+0

是的,這是現場。我最終將LANG環境變量從en_DK.UTF-8更改爲da_DK.UTF-8。卸載postgresql,重新安裝並從postgresql 8.3恢復轉儲。這使它正常工作。 – user2728690

1

原來,這個問題是該PostgreSQL的集羣由系統安裝時創建(Ubuntu的12.04),並有採用C作爲lc_ctype,ASCII作爲編碼,而不是從區域設置en_DK.UTF8繼承。執行pg_dropcluster和pg_createcluster後,使用了正確的語言環境和編碼,並且所有內容都開始正常工作。

+0

如果你的意思是'SQL_ASCII',那純粹是邪惡的。很高興你抓住並修復它。 –