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";