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

Tri/collation/ordre incorrect avec des espaces dans Postgresql 9.4

Sur Unix/Linux SE, un expert sympathique a expliqué que ce que vous voyez est la bonne façon de trier Unicode. En gros, le standard essaie de trier :

di Silva Fred                  di Silva Fred
di Silva John                  diSilva Fred
diSilva Fred                   disílva Fred
diSilva John         ->        di Silva John
disílva Fred                   diSilva John
disílva John                   disílva John

Or si les espaces étaient aussi importants que les lettres, le tri ne pouvait pas séparer les différentes orthographes identiques de Fred et John. Donc, ce qui se passe, c'est qu'il trie d'abord sans espaces. Ensuite, dans un deuxième passage, les chaînes identiques sans espace sont triées. (Il s'agit d'une simplification, le véritable algorithme semble assez complexe, attribuant des espaces, des accents et des caractères non imprimables à différents niveaux de priorité.)

Vous pouvez contourner le classement Unicode en définissant :

export LC_ALL=C

Ou dans Postgres en convertissant en tableau d'octets pour le tri :

order by name::bytea

Ou (d'après la réponse de Kiln) en spécifiant le C collation :

order by name collate "C"

Ou en modifiant le classement par défaut de la colonne :

alter table products alter column name type text collate "C";