我有三種語言的所有國家的桌子:英語,俄語和烏克蘭語。在前兩種語言排序是可以的。但在烏克蘭國家的名字排序不行。PosgreSQL:錯誤的烏克蘭文字排序
在前兩個地方,它代表兩個字母'є'
(ABC中的第8個位置)和'і'
(ABC中的第12個位置)並且所有下一個字母都排序正確。
如何防止這種行爲?數據庫編碼是utf-8。
在此先感謝!
我有三種語言的所有國家的桌子:英語,俄語和烏克蘭語。在前兩種語言排序是可以的。但在烏克蘭國家的名字排序不行。PosgreSQL:錯誤的烏克蘭文字排序
在前兩個地方,它代表兩個字母'є'
(ABC中的第8個位置)和'і'
(ABC中的第12個位置)並且所有下一個字母都排序正確。
如何防止這種行爲?數據庫編碼是utf-8。
在此先感謝!
如果你是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/
UTF-8對「語言」一無所知。對於按字母順序排序以對Postgres有任何意義,您需要set a locale。你的問題根本沒有提到locale,所以我猜你只是使用你的默認語言環境(可能是英語或俄語)進行排序。
如果您已經在使用語言環境,那麼我建議提供客戶端/服務器語言環境設置的詳細信息,因爲那裏可能有錯誤。
我可以設置幾個不同的區域?在哪裏寫這個 - 我的意思是在配置文件或我可以在PhpPgAdmin中做到這一點?它不會影響數據庫性能?謝謝! – 2012-01-28 08:20:28
使用系統環境變量在運行initdb時設置用於排序的區域設置變量LC_COLLATE。換句話說,它是在創建數據庫時設置的。以後不能更改它,因爲它會破壞依賴於一致排序的索引。這意味着你需要爲每種語言使用不同的數據庫(至少對於PostgreSQL 8.4或更低版本)或你自己的排序功能。 – SpliFF 2012-01-28 10:12:56
我正在使用版本8.4 – 2012-01-28 08:42:36
可能是一個很好的理由升級(在其他各種...) – 2012-01-28 08:44:57