Auf Unix/Linux SE erklärte ein freundlicher Experte, dass das, was Sie sehen, die richtige Art ist, Unicode zu sortieren. Grundsätzlich versucht der Standard zu sortieren:
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
Wenn nun Leerzeichen genauso wichtig wären wie Buchstaben, könnte die Sortierung die verschiedenen identischen Schreibweisen von Fred und John nicht trennen. Was also passiert, ist, dass es zuerst ohne Leerzeichen sortiert wird. Dann werden in einem zweiten Durchgang gleiche Strings ohne Whitespace sortiert. (Dies ist eine Vereinfachung, der echte Algorithmus sieht ziemlich komplex aus und weist Leerzeichen, Akzenten und nicht druckbaren Zeichen verschiedene Vorrangstufen zu.)
Sie können die Unicode-Sortierung umgehen, indem Sie Folgendes festlegen:
export LC_ALL=C
Oder in Postgres durch Umwandlung in ein Byte-Array zum Sortieren:
order by name::bytea
Oder (aus Kilns Antwort) durch Angabe des C
Sortierung:
order by name collate "C"
Oder durch Ändern der Standardsortierung für die Spalte:
alter table products alter column name type text collate "C";