Comportamento de classificação para texto (incluindo
char
e varchar
bem como o text
type) depende do agrupamento atual de sua localidade. Veja as perguntas anteriores intimamente relacionadas:
- Classificação PostgreSQL
- https://stackoverflow.com/q/21006868/398670
Se você quiser fazer uma classificação simplista por valor ASCII, em vez de uma classificação localizada corretamente seguindo suas regras de idioma local, você pode usar o
COLLATE
cláusula select *
from test
order by title COLLATE "C" ASC
ou alterar o agrupamento do banco de dados globalmente (requer dump e recarregamento ou reindexação completa). No meu sistema Linux Fedora 19, recebo os seguintes resultados:
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)
O PostgreSQL usa o suporte de agrupamento do seu sistema operacional, portanto, é possível que os resultados variem um pouco de sistema operacional host para sistema operacional host. Em particular, pelo menos algumas versões do Mac OS X quebraram significativamente o manuseio de agrupamento unicode.