PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Falsche Sortierung/Sortierung/Reihenfolge mit Leerzeichen in Postgresql 9.4

Auf Unix/Linux SE erklärte ein freundlicher Experte, dass das, was Sie sehen, die richtige Art ist, Unicode zu sortieren. Grundsätzlich versucht der Standard zu sortieren:

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

Wenn nun Leerzeichen genauso wichtig wären wie Buchstaben, könnte die Sortierung die verschiedenen identischen Schreibweisen von Fred und John nicht trennen. Was also passiert, ist, dass es zuerst ohne Leerzeichen sortiert wird. Dann werden in einem zweiten Durchgang gleiche Strings ohne Whitespace sortiert. (Dies ist eine Vereinfachung, der echte Algorithmus sieht ziemlich komplex aus und weist Leerzeichen, Akzenten und nicht druckbaren Zeichen verschiedene Vorrangstufen zu.)

Sie können die Unicode-Sortierung umgehen, indem Sie Folgendes festlegen:

export LC_ALL=C

Oder in Postgres durch Umwandlung in ein Byte-Array zum Sortieren:

order by name::bytea

Oder (aus Kilns Antwort) durch Angabe des C Sortierung:

order by name collate "C"

Oder durch Ändern der Standardsortierung für die Spalte:

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