sql >> Databáze >  >> RDS >> PostgreSQL

Nesprávné řazení/kompletace/pořadí s mezerami v Postgresql 9.4

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";



  1. Jak přidat oddělovač do zřetězeného řetězce v MySQL – CONCAT_WS()

  2. Kdy musíme použít NVARCHAR/NCHAR místo VARCHAR/CHAR v SQL Server?

  3. ZOBRAZIT DATABÁZE Ekvivalent v SQL Server – sp_databases

  4. Jak správně zapisovat řetězce UTF-8 do MySQL přes rozhraní JDBC