Su Unix/Linux SE, un esperto amichevole ha spiegato che quello che vedi è il modo corretto per ordinare Unicode. Fondamentalmente, lo standard sta cercando di ordinare:
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
Ora, se gli spazi fossero importanti quanto le lettere, l'ordinamento non potrebbe separare le varie ortografie identiche di Fred e John. Quindi quello che succede è che prima ordina senza spazi. Quindi in un secondo passaggio, le stringhe che sono le stesse senza spazi bianchi vengono ordinate. (Questa è una semplificazione, il vero algoritmo sembra abbastanza complesso, assegnando spazi bianchi, accenti e caratteri non stampabili vari livelli di precedenza.)
Puoi ignorare le regole di confronto Unicode impostando:
export LC_ALL=C
O in Postgres eseguendo il cast nell'array di byte per l'ordinamento:
order by name::bytea
Oppure (dalla risposta di Kiln) specificando la C
confronto:
order by name collate "C"
Oppure modificando le regole di confronto predefinite per la colonna:
alter table products alter column name type text collate "C";