我想要一個排序規則,它指定0x1235下面的0x1234的UTF-8編碼,而不管Unicode標準中的字符映射如何。 MySQL爲此使用utf8_bin。 MSSQL顯然http://msdn.microsoft.com/en-us/library/ms143350.aspx有BIN和BIN2排序規則。雖然找到這些很容易,但我甚至找不到排序列表。PostgreSQL對這個特定問題支持的答案要少得多。PostgreSQL UTF-8二進制排序
回答
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的兩個數字不同,那麼對於較低的值,第一個不相等的字節會較小。如果數字在不同的範圍內,那麼對於較低的數字,第一個字節確實會較低。在相同的範圍內,順序由字面上相同的位確定,而不用編碼。
Postgres使用系統區域設置在集羣創建時定義的排序規則。
您可以嘗試ORDER BY編碼(列, '十六進制')的文本
排序順序取決於lc_collate
(而不是在系統區域!)。如果您不提供其他區域設置,則系統區域設置僅在創建數據庫羣集時用作默認值。
您期待的行爲僅適用於區域設置C
。閱讀所有關於它in the fine manual:
C和POSIX排序規則這兩者僅ASCII字母「A」到「Z」指定「傳統C」的行爲,在 被視爲字母, 和排序完成嚴格按字符代碼字節值。
強調我的。 PostgreSQL 9.1有幾個new features for collation。可能正是你正在尋找的。
你如何讓它做字母排序而不是代碼點排序?你知道,所以它使用Unicode排序算法。否則,你將永遠不會對Unicode文本進行字母排序。 – tchrist
@tchrist:通常你已將'lc_collate'設置爲你的語言環境。例如:在英格蘭,您可能會將'lc_collate'設置爲'en_EN.utf8'。嘗試'SHOW lc_collate;'查看您的設置。按照我的答案中的鏈接獲取更多信息。 –
- 1. 排序二進制文件
- 2. MySQL比較二進制排序與二進制字符串
- 3. 排序二進制序列有R
- 4. 快速排序二進制數組
- 5. 排序數組的二進制搜索
- 6. 直接和二進制插入排序
- 7. 二進制閱讀,reinterpret_cast和排序
- 8. 遞歸二進制搜索和排序
- 9. 基數排序使用二進制
- 10. 二進制搜索升序排列C++
- 11. 二進制搜索和插入排序
- 12. 在矢量上的二進制排序
- 13. C++排序二進制文件
- 14. C# - UTF8⇔二進制,十六進制和Base 64轉換器
- 15. 如何按二進制表示法對二進制數組進行排序
- 16. Postgresql排序和限制
- 17. 插入排序和二進制搜索插入排序
- 18. 二進制排序邏輯:不正確排序數字
- 19. 二進制插入排序類似於定期插入排序
- 20. 在Java中使用二進制搜索實現二進制插入排序
- 21. PostgreSQL bytea二進制數據插入
- 22. Java - 二進制插入排序,排除故障
- 23. 使用Java進行排序和二進制搜索
- 24. 十進制到二進制(二進制)
- 25. 如何使用postgresql進行排序?
- 26. PostgreSQL的UTF8處理
- 27. Postgresql排序string_agg
- 28. 二進制Searh和排序由字母順序C++
- 29. C - 氣泡排序程序二進制文件
- 30. C++中的二進制搜索:升序+降序排列陣列
這是一種代碼點排序,在Unicode上無用。你如何使用Unicode排序算法中Unicode所需的排序算法來進行正確的字母排序? – tchrist
@tchrist:這不是問題。 –