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.