Поведение на сортиране за текст (включително char
и varchar
както и text
тип) зависи от текущото съпоставяне от вашия локал.
Вижте предишните тясно свързани въпроси:
- Сортиране на PostgreSQL
- https://stackoverflow.com/q/21006868/398670
Ако искате да направите опростено сортиране по ASCII стойност, вместо правилно локализирано сортиране, следвайки правилата на местния ви език, можете да използвате COLLATE
клауза
select *
from test
order by title COLLATE "C" ASC
или променете глобално съпоставянето на базата данни (изисква изхвърляне и презареждане или пълно преиндексиране). На моята Fedora 19 Linux система получавам следните резултати:
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 използва поддръжката за съпоставяне на вашата операционна система, така че е възможно резултатите да варират леко от хост ОС до хост ОС. По-специално, поне някои версии на Mac OS X имат значително нарушена обработка на съпоставяне на Unicode.