sql >> Database teknologi >  >> RDS >> PostgreSQL

Forkert sortering/sortering/rækkefølge med mellemrum i Postgresql 9.4

På Unix/Linux SE forklarede en venlig ekspert, at det, du ser, er den rigtige måde at sortere Unicode på. Grundlæggende forsøger standarden at sortere:

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

Hvis nu mellemrum var lige så vigtige som bogstaver, kunne den slags ikke adskille de forskellige identiske stavemåder af Fred og John. Så det, der sker, er, at det først sorterer uden mellemrum. Derefter sorteres strenge, der er ens uden mellemrum, i en anden omgang. (Dette er en forenkling, den rigtige algoritme ser ret kompleks ud og tildeler mellemrum, accenter og ikke-udskrivbare tegn forskellige niveauer af forrang.)

Du kan omgå Unicode-sorteringen ved at indstille:

export LC_ALL=C

Eller i Postgres ved at caste til byte-array til sortering:

order by name::bytea

Eller (fra Kilns svar) ved at angive C indsamling:

order by name collate "C"

Eller ved at ændre standardsorteringen for kolonnen:

alter table products alter column name type text collate "C";



  1. Erstat enkelte anførselstegn i SQL Server

  2. SQL GROUP BY CASE-sætning med aggregeret funktion

  3. Jeg kan ikke bruge mysql_* funktioner efter opgradering af PHP

  4. Oracle SQL-forespørgsel:Hent seneste værdier pr. gruppe baseret på tid