web-dev-qa-db-fra.com

Comment changer le client_encoding par défaut dans Postgres?

J'essaie de changer la valeur par défaut de la variable de configuration client_encoding pour une base de données PostgreSQL que j'utilise. Je veux que ce soit UTF8, mais actuellement, il devient LATIN1.

La base de données est déjà configurée pour utiliser le codage UTF8:

application_database=# \l
                                                 List of databases
           Name       |  Owner   | Encoding |   Collate   |    Ctype    |          Access privileges
----------------------+----------+----------+-------------+-------------+--------------------------------------
 postgres             | postgres | LATIN1   | en_US       | en_US       |
 application_database | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | postgres=CTc/postgres           +
                      |          |          |             |             | application_database=Tc/postgres
 template0            | postgres | LATIN1   | en_US       | en_US       | =c/postgres                     +
                      |          |          |             |             | postgres=CTc/postgres
 template1            | postgres | LATIN1   | en_US       | en_US       | =c/postgres                     +
                      |          |          |             |             | postgres=CTc/postgres
(4 rows)

D'après ce que selon la documentation devrait déjà, le client utilise UTF8 comme valeur par défaut client_encoding (l'emphase mienne):

client_encoding (string)

Définit le codage côté client (jeu de caractères). La valeur par défaut consiste à utiliser le codage de la base de données.

Mais ce n'est pas le cas:

$ Sudo psql --dbname=application_database
psql (9.1.19)
Type "help" for help.

application_database=# SHOW client_encoding;
 client_encoding
-----------------
 LATIN1
(1 row)

J'ai même essayé d'utiliser ALTER USER <user> SET ... pour modifier la configuration par défaut de l'utilisateur que je me connecte en tant que:

application_database=# ALTER USER root SET client_encoding='UTF8';
ALTER ROLE
application_database=# SELECT usename, useconfig FROM pg_shadow;
         usename      |       useconfig
----------------------+------------------------
 postgres             |
 root                 | {client_encoding=UTF8}
 application_database |
(3 rows)

Mais cela n'a eu aucun effet:

$ Sudo psql --dbname=application_database
psql (9.1.19)
Type "help" for help.

application_database=# SELECT current_user;
 current_user
--------------
 root
(1 row)

application_database=# SHOW client_encoding;
 client_encoding
-----------------
 LATIN1
(1 row)

Il n'y a rien dans les fichiers PSQL de mon système:

vagrant@app-database:~$ cat ~/.psqlrc
cat: /home/vagrant/.psqlrc: No such file or directory
vagrant@app-database:~$ cat /etc/psqlrc
cat: /etc/psqlrc: No such file or directory
vagrant@app-database:~$ Sudo su
root@app-database:/home/vagrant# cat ~/.psqlrc
cat: /root/.psqlrc: No such file or directory

J'exécute PosgreSQL 9.1:

application_database=# SELECT version();
                                                   version
-------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.1.19 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit
(1 row)
5
Ajedi32

D'accord, alors commençons par le début: pourquoi la définition du codage de l'utilisateur ou de la base de données n'a-t-elle aucun effet?

Il s'avère que c'est à cause de cette ligne de la documentation de psql :

Si au moins une des entrées ou sorties standard est un terminal, psql définit le codage client sur "auto", ce qui détectera le codage client approprié à partir des paramètres régionaux (variable d’environnement LC_CTYPE sur les systèmes Unix). Si cela ne fonctionne pas comme prévu, le codage du client peut être remplacé à l'aide de la variable d'environnement PGCLIENTENCODING.

Donc, en fait, vos modifications de configuration précédentes ont en fait ont fonctionnées, mais pas dans la console interactive psql. Essayez la commande suivante:

Sudo psql --dbname=application_database -c "SHOW client_encoding;" | cat

Vous devriez voir que l'encodage du client est en fait UTF8:

 client_encoding
-----------------
 UTF8
(1 row)

Exécutez à nouveau la commande, mais sans la transférer vers cat:

Sudo psql --dbname=application_database -c "SHOW client_encoding;"

Vous devriez obtenir le résultat:

 client_encoding
-----------------
 LATIN1
(1 row)

En résumé, psql utilise uniquement le codage LATIN1 pour les commandes impliquant le terminal.

Comment peux-tu réparer cela? Eh bien, il y a plusieurs façons possibles.

Une solution consiste à faire ce que les documents suggèrent et à définir la variable d’environnement PGCLIENTENCODING sur UTF8 persistante, telle que ~/.profile ou ~/.bashrc pour n’affecter que votre utilisateur, ou /etc/environment pour affecter l’ensemble du système (voir Comment définir des variables d’environnement de manière permanente ).

Une autre option serait de configurer vos paramètres régionaux système pour utiliser en_US.utf8 au lieu de en_US (ou équivalent). La méthode pour ce faire peut varier en fonction de votre système, mais vous pouvez généralement le faire en modifiant ~/.config/locale.conf (votre utilisateur uniquement) ou /etc/default/locale ou /etc/locale.conf (à l'échelle du système). Cela n'affectera pas que postgres, et je crois que s'attaque plus étroitement à la racine du problème. Vous pouvez vérifier vos paramètres régionaux actuels en exécutant locale .

Une autre solution serait de mettre à jour votre fichier psqlrc pour inclure SET client_encoding=UTF8;. Ce fichier est situé à ~/.psqlrc (votre utilisateur uniquement) ou /etc/psqlrc (à l'échelle du système). Notez que cette méthode n’affectera pas le résultat de la commande que nous utilisions précédemment pour l’encodage du client, car l’état de la documentation (emphase mine):

--command=command

Spécifie que psql doit exécuter une chaîne de commande, une commande, puis quitter. Ceci est utile dans les scripts Shell. Les fichiers de démarrage (psqlrc et ~/.psqlrc) sont ignorés avec cette option.

9
Ajedi32

Avez-vous défini client_encoding dans postgresql.conf (et rechargez-vous la configuration ou redémarrez-vous)? Assurez-vous que ce n'est pas UTF8 utf8

Quel est le résultat de cat ~/.psqlrc et cat /etc/psqlrc?

Je sais que vous recherchez une valeur par défaut côté serveur, mais sur le client, vous pouvez définir une Envvar du système d'exploitation:

export PGCLIENTENCODING=UTF8

faire cela pour tous les utilisateurs (sur cette machine), mettez cela dans /etc/profile

1
Neil McGuigan