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

Ordinamento errato di PostgreSQL

Comportamento di ordinamento per il testo (incluso char e varchar così come il text tipo) dipende dalle confrontazioni correnti della tua località.

Vedi le precedenti domande strettamente correlate:

  • Ordinamento PostgreSQL
  • https://stackoverflow.com/q/21006868/398670

Se vuoi eseguire un ordinamento semplicistico per valore ASCII, piuttosto che un ordinamento correttamente localizzato seguendo le regole della tua lingua locale, puoi usare il COLLATE clausola

select * 
from test
order by title COLLATE "C" ASC

o modificare le regole di confronto del database a livello globale (richiede dump e ricarica o reindicizzazione completa). Sul mio sistema Fedora 19 Linux, ottengo i seguenti risultati:

regress=> SHOW lc_collate;
 lc_collate  
-------------
 en_US.UTF-8
(1 row)

regress=> WITH v(title) AS (VALUES ('#a'), ('a'), ('#'), ('a#a'), ('a#')) 
          SELECT title FROM v ORDER BY title ASC;
 title 
-------
 #
 a
 #a
 a#
 a#a
(5 rows)

regress=> WITH v(title) AS (VALUES ('#a'), ('a'), ('#'), ('a#a'), ('a#')) 
          SELECT title FROM v ORDER BY title COLLATE "C" ASC;
 title 
-------
 #
 #a
 a
 a#
 a#a
(5 rows)

PostgreSQL utilizza il supporto per le regole di confronto del tuo sistema operativo, quindi è possibile che i risultati varino leggermente dal sistema operativo host al sistema operativo host. In particolare, almeno alcune versioni di Mac OS X hanno interrotto in modo significativo la gestione delle regole di confronto Unicode.