PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Classificação incorreta do PostgreSQL


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.