2012-01-28 46 views
1

我有三種語言的所有國家的桌子:英語,俄語和烏克蘭語。在前兩種語言排序是可以的。但在烏克蘭國家的名字排序不行。PosgreSQL:錯誤的烏克蘭文字排序

在前兩個地方,它代表兩個字母'є'(ABC中的第8個位置)和'і'(ABC中的第12個位置)並且所有下一個字母都排序正確。

如何防止這種行爲?數據庫編碼是utf-8。

在此先感謝!

回答

3

如果你是9.1,你可以添加整理用於分揀到您的ORDER BY子句:

SELECT * 
FROM your_table 
ORDER BY your_column COLLATE "ua_UA" 

排序規則的名稱取決於您的操作系統 - 不知道正確的名稱爲烏克蘭將是。但我認爲你明白了。

您可能還需要閱讀此博客條目:

http://www.depesz.com/index.php/2011/03/04/waiting-for-9-1-per-column-collation-support/

+0

我正在使用版本8.4 – 2012-01-28 08:42:36

+0

可能是一個很好的理由升級(在其他各種...) – 2012-01-28 08:44:57

3

UTF-8對「語言」一無所知。對於按字母順序排序以對Postgres有任何意義,您需要set a locale。你的問題根本沒有提到locale,所以我猜你只是使用你的默認語言環境(可能是英語或俄語)進行排序。

如果您已經在使用語言環境,那麼我建議提供客戶端/服務器語言環境設置的詳細信息,因爲那裏可能有錯誤。

+0

我可以設置幾個不同的區域?在哪裏寫這個 - 我的意思是在配置文件或我可以在PhpPgAdmin中做到這一點?它不會影響數據庫性能?謝謝! – 2012-01-28 08:20:28

+1

使用系統環境變量在運行initdb時設置用於排序的區域設置變量LC_COLLATE。換句話說,它是在創建數據庫時設置的。以後不能更改它,因爲它會破壞依賴於一致排序的索引。這意味着你需要爲每種語言使用不同的數據庫(至少對於PostgreSQL 8.4或更低版本)或你自己的排序功能。 – SpliFF 2012-01-28 10:12:56