На Unix/Linux SE приятелски експерт обясни, че това, което виждате, е правилният начин за сортиране на Unicode. По принцип стандартът се опитва да сортира:
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
Сега, ако интервалите бяха толкова важни, колкото буквите, сортът не можеше да раздели различните идентични изписвания на Фред и Джон. Така че това, което се случва, е, че първо се сортира без интервали. След това при второ преминаване се сортират низове, които са еднакви без интервал. (Това е опростяване, истинският алгоритъм изглежда доста сложен, като присвоява интервали, акценти и непечатаеми знаци на различни нива на приоритет.)
Можете да заобиколите съпоставянето на Unicode, като зададете:
export LC_ALL=C
Или в Postgres чрез прехвърляне към байтов масив за сортиране:
order by name::bytea
Или (от отговора на Kiln), като посочите C
съпоставяне:
order by name collate "C"
Или чрез промяна на съпоставянето по подразбиране за колоната:
alter table products alter column name type text collate "C";