sql >> Databasteknik >  >> RDS >> PostgreSQL

Felaktig sortering/sortering/ordning med mellanslag i Postgresql 9.4

På Unix/Linux SE förklarade en vänlig expert att det du ser är det rätta sättet att sortera Unicode. I grund och botten försöker standarden sortera:

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

Om mellanslag nu var lika viktiga som bokstäver, kunde sorten inte skilja mellan de olika identiska stavningarna av Fred och John. Så vad som händer är att det först sorterar utan mellanslag. Sedan i ett andra pass sorteras strängar som är likadana utan blanksteg. (Detta är en förenkling, den verkliga algoritmen ser ganska komplex ut och tilldelar blanksteg, accenter och icke-utskrivbara tecken olika prioritetsnivåer.)

Du kan kringgå Unicode-sorteringen genom att ställa in:

export LC_ALL=C

Eller i Postgres genom att casta till byte-array för sortering:

order by name::bytea

Eller (från Kilns svar) genom att ange C sammanställning:

order by name collate "C"

Eller genom att ändra standardsorteringen för kolumnen:

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



  1. Oracle-certifieringar

  2. MySQL främmande nyckel begränsningar, kaskad radering

  3. Problemet med förlorad uppdatering i samtidiga transaktioner

  4. Hur man ansluter till Oracle 11g-databasen på distans