Sắp xếp hành vi cho văn bản (bao gồm char
và varchar
cũng như text
loại) phụ thuộc vào đối chiếu hiện tại ngôn ngữ của bạn.
Xem các câu hỏi liên quan chặt chẽ trước đây:
- Sắp xếp PostgreSQL
- https://stackoverflow.com/q/21006868/398670
Nếu bạn muốn sắp xếp đơn giản theo giá trị ASCII, thay vì sắp xếp được bản địa hóa đúng theo quy tắc ngôn ngữ địa phương của bạn, bạn có thể sử dụng COLLATE
mệnh đề
select *
from test
order by title COLLATE "C" ASC
hoặc thay đổi đối chiếu cơ sở dữ liệu trên toàn cầu (yêu cầu kết xuất và tải lại hoặc lập chỉ mục đầy đủ). Trên hệ thống Fedora 19 Linux của mình, tôi nhận được các kết quả sau:
regress=> SHOW lc_collate;
lc_collate
-------------
en_US.UTF-8
(1 row)
regress=> WITH v(title) AS (VALUES ('#a'), ('a'), ('#'), ('a#a'), ('a#'))
SELECT title FROM v ORDER BY title ASC;
title
-------
#
a
#a
a#
a#a
(5 rows)
regress=> WITH v(title) AS (VALUES ('#a'), ('a'), ('#'), ('a#a'), ('a#'))
SELECT title FROM v ORDER BY title COLLATE "C" ASC;
title
-------
#
#a
a
a#
a#a
(5 rows)
PostgreSQL sử dụng hỗ trợ đối chiếu của hệ điều hành của bạn, do đó, kết quả có thể thay đổi một chút từ hệ điều hành chủ sang hệ điều hành chủ. Đặc biệt, ít nhất một số phiên bản của Mac OS X đã phá vỡ đáng kể việc xử lý đối chiếu unicode.