2011-10-15 25 views

回答

5

C語言環境會做。 UTF-8的設計使得字節排序也是碼點排序。這是不平凡的,但考慮UTF-8是如何工作的:

 
Number range Byte 1 Byte 2 Byte 3 
0000-007F  0xxxxxxx 
0080-07FF  110xxxxx 10xxxxxx 
0800-FFFF  1110xxxx 10xxxxxx 10xxxxxx 

當排序二進制數據又名C語言環境,第一個不相等的字節將etermine orering。我們需要看到,如果編碼爲UTF-8的兩個數字不同,那麼對於較低的值,第一個不相等的字節會較小。如果數字在不同的範圍內,那麼對於較低的數字,第一個字節確實會較低。在相同的範圍內,順序由字面上相同的位確定,而不用編碼。

+0

這是一種代碼點排序,在Unicode上無用。你如何使用Unicode排序算法中Unicode所需的排序算法來進行正確的字母排序? – tchrist

+2

@tchrist:這不是問題。 –

1

Postgres使用系統區域設置在集羣創建時定義的排序規則。

您可以嘗試ORDER BY編碼(列, '十六進制')的文本

5

排序順序取決於lc_collate(而不是在系統區域!)。如果您不提供其他區域設置,則系統區域設置僅在創建數據庫羣集時用作默認值。

您期待的行爲僅適用於區域設置C。閱讀所有關於它in the fine manual

C和POSIX排序規則這兩者僅ASCII字母「A」到「Z」指定「傳統C」的行爲,在 被視爲字母, 和排序完成嚴格按字符代碼字節值

強調我的。 PostgreSQL 9.1有幾個new features for collation。可能正是你正在尋找的。

+0

你如何讓它做字母排序而不是代碼點排序?你知道,所以它使用Unicode排序算法。否則,你將永遠不會對Unicode文本進行字母排序。 – tchrist

+0

@tchrist:通常你已將'lc_collat​​e'設置爲你的語言環境。例如:在英格蘭,您可能會將'lc_collat​​e'設置爲'en_EN.utf8'。嘗試'SHOW lc_collat​​e;'查看您的設置。按照我的答案中的鏈接獲取更多信息。 –