PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Tri incorrect de PostgreSQL

Comportement de tri pour le texte (y compris char et varchar ainsi que le text type) dépend du classement actuel de votre région.

Voir les questions précédentes étroitement liées :

  • Tri PostgreSQL
  • https://stackoverflow.com/q/21006868/398670

Si vous souhaitez effectuer un tri simpliste par valeur ASCII, plutôt qu'un tri correctement localisé suivant les règles de votre langue locale, vous pouvez utiliser le COLLATE clause

select * 
from test
order by title COLLATE "C" ASC

ou modifier globalement le classement de la base de données (nécessite un vidage et un rechargement, ou une réindexation complète). Sur mon système Linux Fedora 19, j'obtiens les résultats suivants :

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 utilise le support de classement de votre système d'exploitation, il est donc possible que les résultats varient légèrement d'un système d'exploitation hôte à l'autre. En particulier, au moins certaines versions de Mac OS X ont une gestion des collations Unicode considérablement interrompue.