W systemie Unix/Linux SE przyjazny ekspert wyjaśnił, że to, co widzisz, jest właściwym sposobem sortowania Unicode. Zasadniczo standard próbuje posortować:
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
Skoro spacje były tak samo ważne jak litery, sortowanie nie mogło oddzielić różnych identycznych pisowni Freda i Johna. Więc dzieje się tak, że najpierw sortuje bez spacji. Następnie w drugim przebiegu sortowane są ciągi, które są takie same bez spacji. (To uproszczenie, prawdziwy algorytm wygląda na dość skomplikowany, przypisując odstępy, akcenty i znaki niedrukowalne różne poziomy pierwszeństwa).
Możesz pominąć sortowanie Unicode, ustawiając:
export LC_ALL=C
Lub w Postgresie, rzutując na tablicę bajtów w celu sortowania:
order by name::bytea
Lub (z odpowiedzi Kilna), określając C
zestawienie:
order by name collate "C"
Lub zmieniając domyślne sortowanie kolumny:
alter table products alter column name type text collate "C";