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 :
/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 main
Dans 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

Posts les plus consultés de ce blog

Comment extraire les fichiers disques en raw d'un backup proxmox vma

Find the lists of disks of your Proxmox VM stored in a ceph cluster

Comment copier une machine virtuelle kvm en raw sur un Volume Group LVM2 se trouvant sur un disque en DRBD