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

Ordinamento/fascizione/ordine errato con spazi in Postgresql 9.4

Su Unix/Linux SE, un esperto amichevole ha spiegato che quello che vedi è il modo corretto per ordinare Unicode. Fondamentalmente, lo standard sta cercando di ordinare:

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

Ora, se gli spazi fossero importanti quanto le lettere, l'ordinamento non potrebbe separare le varie ortografie identiche di Fred e John. Quindi quello che succede è che prima ordina senza spazi. Quindi in un secondo passaggio, le stringhe che sono le stesse senza spazi bianchi vengono ordinate. (Questa è una semplificazione, il vero algoritmo sembra abbastanza complesso, assegnando spazi bianchi, accenti e caratteri non stampabili vari livelli di precedenza.)

Puoi ignorare le regole di confronto Unicode impostando:

export LC_ALL=C

O in Postgres eseguendo il cast nell'array di byte per l'ordinamento:

order by name::bytea

Oppure (dalla risposta di Kiln) specificando la C confronto:

order by name collate "C"

Oppure modificando le regole di confronto predefinite per la colonna:

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