Na Unix/Linux SE přátelský odborník vysvětlil, že to, co vidíte, je správný způsob, jak třídit Unicode. Standard se v zásadě snaží třídit:
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
Kdyby byly mezery stejně důležité jako písmena, nemohlo by toto řazení oddělit různá identická hláskování Freda a Johna. Stane se tedy, že nejprve seřadí bez mezer. Poté jsou ve druhém průchodu seřazeny řetězce, které jsou stejné bez mezer. (Toto je zjednodušení, skutečný algoritmus vypadá poměrně složitě a přiřazuje mezery, diakritiku a netisknutelné znaky různé úrovně priority.)
Řazení Unicode můžete obejít nastavením:
export LC_ALL=C
Nebo v Postgresu přetypováním do pole bajtů pro řazení:
order by name::bytea
Nebo (z odpovědi pece) zadáním C
řazení:
order by name collate "C"
Nebo změnou výchozího řazení pro sloupec:
alter table products alter column name type text collate "C";