På Unix/Linux SE forklarede en venlig ekspert, at det, du ser, er den rigtige måde at sortere Unicode på. Grundlæggende forsøger standarden at sortere:
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
Hvis nu mellemrum var lige så vigtige som bogstaver, kunne den slags ikke adskille de forskellige identiske stavemåder af Fred og John. Så det, der sker, er, at det først sorterer uden mellemrum. Derefter sorteres strenge, der er ens uden mellemrum, i en anden omgang. (Dette er en forenkling, den rigtige algoritme ser ret kompleks ud og tildeler mellemrum, accenter og ikke-udskrivbare tegn forskellige niveauer af forrang.)
Du kan omgå Unicode-sorteringen ved at indstille:
export LC_ALL=C
Eller i Postgres ved at caste til byte-array til sortering:
order by name::bytea
Eller (fra Kilns svar) ved at angive C
indsamling:
order by name collate "C"
Eller ved at ændre standardsorteringen for kolonnen:
alter table products alter column name type text collate "C";