En Unix/Linux SE, un amable experto explicó que lo que ve es la forma correcta de ordenar Unicode. Básicamente, el estándar está tratando de ordenar:
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
Ahora bien, si los espacios fueran tan importantes como las letras, el género no podría separar las diversas ortografías idénticas de Fred y John. Entonces, lo que sucede es que primero ordena sin espacios. Luego, en un segundo paso, se ordenan las cadenas que son iguales sin espacios en blanco. (Esto es una simplificación, el algoritmo real parece bastante complejo, asignando varios niveles de precedencia a espacios en blanco, acentos y caracteres no imprimibles).
Puede omitir la intercalación de Unicode configurando:
export LC_ALL=C
O en Postgres mediante conversión a matriz de bytes para ordenar:
order by name::bytea
O (de la respuesta de Kiln) especificando C
colación:
order by name collate "C"
O modificando la intercalación predeterminada para la columna:
alter table products alter column name type text collate "C";