postgresql et les encodages
Sur une distribution récente avec la base de données Postgresql je n'arrivais pas à créer une nouvelle BD avec un encodage LATIN1.
Après quelques recherches le problème provient du fait qu'a l'installation du paquet le cluster est créé avec un encodage UTF8, pour vérifier regarder la valeur de :
Dans mon cas j'avais :
LC_COLLATE:fr_CH.UTF-8
LC_CTYPE: fr_CH.UTF-8
Or le problème avec cette config c'est que du coup quand on veut créer une nouvelle base de données avec un encodage différent rien ne va plus.
On se voit recevoir un message fort peu sympathique en forme de fin de non-recevoir :
createdb: database creation failed: ERREUR: l'encodage LATIN1 ne correspond pas à la locale fr_CH.UTF-8 du serveur
DETAIL: Le paramètre LC_CTYPE du serveur nécessite l'encodage UTF8.
L'explication se trouve dans la documentation postgresql Si on veut pouvoir lor de la création de base de données utiliser n'importe quel encodage il faut pour le initdb utiliser "C" ou "POSIX" pour le locale par défaut
Donc la solution consiste a casser le cluster par défaut (n'oubliez pas de backupez avant)
Hum Encore une fois ATTENTION ne lancez pas un pg_dropcluster sur un serveur en prod avec des données car il est clair que cela détruit de façon irrémédiable vos données
Et voila maintenant on peut créer une BD en LATIN1 avec
Après quelques recherches le problème provient du fait qu'a l'installation du paquet le cluster est créé avec un encodage UTF8, pour vérifier regarder la valeur de :
/usr/lib/postgresql/8.3/bin/pg_controldata /var/lib/postgresql/8.3/main/
Dans mon cas j'avais :
LC_COLLATE:fr_CH.UTF-8
LC_CTYPE: fr_CH.UTF-8
Or le problème avec cette config c'est que du coup quand on veut créer une nouvelle base de données avec un encodage différent rien ne va plus.
su postgres -c 'createdb -E LATIN1 -O cgdb goeland'
On se voit recevoir un message fort peu sympathique en forme de fin de non-recevoir :
createdb: database creation failed: ERREUR: l'encodage LATIN1 ne correspond pas à la locale fr_CH.UTF-8 du serveur
DETAIL: Le paramètre LC_CTYPE du serveur nécessite l'encodage UTF8.
L'explication se trouve dans la documentation postgresql Si on veut pouvoir lor de la création de base de données utiliser n'importe quel encodage il faut pour le initdb utiliser "C" ou "POSIX" pour le locale par défaut
Donc la solution consiste a casser le cluster par défaut (n'oubliez pas de backupez avant)
Hum Encore une fois ATTENTION ne lancez pas un pg_dropcluster sur un serveur en prod avec des données car il est clair que cela détruit de façon irrémédiable vos données
pg_dropcluster --stop 8.3 main localedef -f ISO-8859-1 -i fr_CH fr_CH.ISO-8859-1 export LANG="fr_CH.iso88591" pg_createcluster --locale fr_CH.iso88591 8.3 mainDans la foulée on fixe le mot de passe de postgresql avec :
su postgres psql template1
ALTER USER postgres WITH PASSWORD '123456';
Et voila maintenant on peut créer une BD en LATIN1 avec
su -c "createdb -E LATIN1 mabellebdenlatin1" postgres
Commentaires