PostgreSQL 8.4 e il locale it_IT
Oct 24th, 2009 by paolo
PostgreSQL mi accompagna nel mio lavoro da ormai 8 anni e di versione in versione mi ha sempre regalato delle soddisfazioni. Di recente, volendo migrare dalla versione 8.0.2 alla recente 8.4.1 ho dovuto litigare un po' per fargli digerire il fatto che sullo stesso server devono coesistere database LATIN1, LATIN9 e UTF-8. Con l'ultima versione, PostreSQL, è diventato infatti un po' più rigoroso nella gestione dei locale senza però documentare in maniera opportuna la cosa. La documentazione ufficiale non va oltre qualche esempio e quindi ho dovuto andare un po' per tentativi, e riuscire a creare i dabatase con encoding voluto e il locale opportuno (it_IT).
Il mio server dopo essere stato inizializzato con i valori di default presenteva la seguente situazione:
$ psql -h webdb -l
List of databases
Name | Owner | Encoding | Collation | Ctype | Access privileges
-------------------+----------+----------+------------+------------+-----------------------
postgres | postgres | LATIN1 | C | en_US |
template0 | postgres | LATIN1 | C | en_US | =c/postgres
: postgres=CTc/postgres
template1 | postgres | LATIN1 | C | en_US | =c/postgres
: postgres=CTc/postgres
In questa situazione se provato a create un database in UTF-8 o LATIN9 con il comando createdb -E UTF8 dbname mi beccavo puntualmente il seguente errore:
createdb: database creation failed: ERROR: encoding UTF8 does not match locale en_US DETAIL: The chosen LC_CTYPE setting requires encoding LATIN1.
o
createdb: database creation failed: ERROR: encoding LATIN9 does not match locale en_US DETAIL: The chosen LC_CTYPE setting requires encoding LATIN1.
nel caso dell'encoding LATIN9.
La soluzione, seppur non immediata, c'è sfruttando proprio il comando CREATE DATABASE all'interno dell'interprete dei comandi. In particolare per creare un db con encoding UTF-8 e locale it_IT bisogna usare il seguente comando:
-
CREATE DATABASE "nomedb"
-
ENCODING 'UTF8'
-
LC_CTYPE='it_IT.UTF8'
-
LC_COLLATE='it_IT.UTF8'
-
TEMPLATE template0;
Mentre per creare un database con encoding LATIN9 e locale it_IT il comando è il seguente:
-
CREATE DATABASE "nomedb"
-
ENCODING 'LATIN9'
-
LC_CTYPE='it_IT@euro'
-
LC_COLLATE='it_IT@euro'
-
TEMPLATE template0;

