På Unix/Linux SE förklarade en vänlig expert att det du ser är det rätta sättet att sortera Unicode. I grund och botten försöker standarden sortera:
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
Om mellanslag nu var lika viktiga som bokstäver, kunde sorten inte skilja mellan de olika identiska stavningarna av Fred och John. Så vad som händer är att det först sorterar utan mellanslag. Sedan i ett andra pass sorteras strängar som är likadana utan blanksteg. (Detta är en förenkling, den verkliga algoritmen ser ganska komplex ut och tilldelar blanksteg, accenter och icke-utskrivbara tecken olika prioritetsnivåer.)
Du kan kringgå Unicode-sorteringen genom att ställa in:
export LC_ALL=C
Eller i Postgres genom att casta till byte-array för sortering:
order by name::bytea
Eller (från Kilns svar) genom att ange C
sammanställning:
order by name collate "C"
Eller genom att ändra standardsorteringen för kolumnen:
alter table products alter column name type text collate "C";