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.