2011-10-15 22 views
6

Tôi muốn có một collation mà lệnh mã hóa UTF-8 0x1234 dưới 0x1235 bất kể bản đồ ký tự trong tiêu chuẩn Unicode. MySQL sử dụng utf8_bin cho việc này. MSSQL dường như http://msdn.microsoft.com/en-us/library/ms143350.aspx có collations BIN và BIN2. Trong khi việc tìm kiếm chúng thật dễ dàng, tôi thậm chí không thể tìm thấy danh sách collations PostgreSQL hỗ trợ câu trả lời ít hơn nhiều cho câu hỏi cụ thể này.PostgreSQL UTF-8 collation nhị phân

Trả lời

5

Miền địa phương C sẽ thực hiện. UTF-8 được thiết kế sao cho thứ tự byte cũng được đặt theo thứ tự codepoint. Đây không phải là tầm thường nhưng xem xét mức độ UTF-8 hoạt động:

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

Khi sắp xếp dữ liệu nhị phân aka C miền địa phương, các byte không bình đẳng đầu tiên sẽ etermine orering. Những gì chúng tôi neeed để thấy rằng nếu hai số được mã hóa thành UTF-8 khác nhau thì byte không bằng nhau đầu tiên sẽ thấp hơn cho giá trị thấp hơn. Nếu các số nằm trong các phạm vi khác nhau thì byte đầu tiên thực sự sẽ thấp hơn cho số thấp hơn. Trong cùng một phạm vi, thứ tự được xác định theo nghĩa đen các bit giống như không có mã hóa.

+0

Đó là một loại điểm mã, hoàn toàn vô dụng trên Unicode. Làm thế nào để bạn làm cho nó làm một loại chữ cái thích hợp bằng cách sử dụng thuật toán sắp xếp theo yêu cầu của Unicode trong thuật toán Unicode Collation Algorithm? – tchrist

+2

@ tchrist: Đó không phải là câu hỏi. –

1

Postgres sử dụng collation được xác định bởi ngôn ngữ hệ thống khi tạo cụm.

Bạn có thể thử để ORDER BY mã hóa (cột, 'hex')

5

Sắp xếp thứ tự của văn bản phụ thuộc vào lc_collate (không phải trên miền địa phương hệ thống!). Miền địa phương hệ thống chỉ phục vụ như là một mặc định khi tạo cụm db nếu bạn không cung cấp một miền địa phương khác.

Hành vi bạn đang mong đợi chỉ hoạt động với ngôn ngữ C. Đọc tất cả về nó in the fine manual:

Các collations C và POSIX cả xác định hành vi "C truyền thống", trong mà chỉ các kí tự ASCII "A" thông qua "Z" được coi là chữ cái, và phân loại được thực hiện theo đúng giá trị byte mã ký tự.

Mỏ nhấn mạnh. PostgreSQL 9.1 có một số new features for collation. Có thể chính xác những gì bạn đang tìm kiếm.

+0

Làm thế nào để bạn làm cho nó làm một loại chữ cái thay vì sắp xếp một điểm mã? Bạn biết đấy, vì vậy nó sử dụng thuật toán Unicode Collation Algorithm. Nếu không, bạn sẽ không bao giờ nhận được một sắp xếp chữ cái trên văn bản Unicode. – tchrist

+0

@tchrist: Thông thường bạn có 'lc_collate' được đặt thành ngôn ngữ của bạn. Ví dụ: ở Anh, bạn có thể có 'lc_collate' được đặt thành' en_EN.utf8'. Hãy thử 'SHOW lc_collate;' để xem cài đặt của bạn. Theo liên kết trong câu trả lời của tôi để biết thêm thông tin. –