Comment puis-je changer la valeur par défaut client_encoding dans Postgres?
Je suis en train de modifier la valeur par défaut pour le client_encoding
variable de configuration pour une base de données PostgreSQL, je suis en cours d'exécution. Je veux qu'il soit UTF8
, mais actuellement c'est à LATIN1
.
La base de données est déjà configuré pour utiliser l'encodage 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)
Qui selon les docs devrait déjà amener le client à utiliser UTF8 par défaut client_encoding
(l'emphase est mienne):
client_encoding (string)
Définit le côté client de l'encodage (jeu de caractères). La valeur par défaut est d'utiliser la base de données de codage.
Mais il n'a pas d':
$ 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 pour l'utilisateur que je suis connecter 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 qui a également 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 le PSQL les fichiers sur 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
Je suis en cours d'exécution 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)
OriginalL'auteur Ajedi32 | 2016-04-28
Vous devez vous connecter pour publier un commentaire.
Bon, alors tout d'abord: pourquoi n'est-il pas de réglage de l'utilisateur de base de données ou codage avoir aucun effet?
S'avère que c'est à cause de cette ligne de la documentation psql:
Donc, en fait, votre configuration précédente changements en fait ont été de travail, tout simplement pas dans le interactive
psql
de la console. Essayez la commande suivante:Vous devriez voir que le client encodage est en fait UTF8:
Maintenant, exécutez de nouveau la commande, mais sans la tuyauterie à
cat
:Vous devriez obtenir le résultat:
Donc, fondamentalement, psql est seulement à l'aide de
LATIN1
codant pour les commandes impliquant le terminal.Comment pouvez-vous résoudre ce problème? Eh bien, il ya quelques façons possibles.
Serait de faire comme les docs proposer et de définir la
PGCLIENTENCODING
variable d'environnement pourUTF8
quelque part persistants, tels que~/.profile
ou~/.bashrc
affecter que votre utilisateur, ou/etc/environment
d'affecter l'ensemble du système (voir Comment régler durablement les variables d'environnement).Une autre option serait de configurer votre système de paramètres régionaux à utiliser
en_US.utf8
au lieu deen_US
(ou l'équivalent). La méthode pour faire cela peut varier selon votre système, mais vous pouvez le faire en modifiant~/.config/locale.conf
(votre utilisateur uniquement) ou/etc/default/locale
ou/etc/locale.conf
(à l'échelle du système). Cela va affecter plus que juste postgres, et je crois de plus près les adresses à la racine du problème. Vous pouvez vérifier les paramètres régionaux actuels en exécutantlocale
.Une autre solution serait de mettre à jour votre psqlrc fichier à 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'affecte pas le résultat de la commande, nous avons été à l'aide de la client encodage plus tôt, depuis les docs de l'état (l'emphase est mienne):OriginalL'auteur Ajedi32
Avez-vous mis
client_encoding
danspostgresql.conf
(et de recharger la configuration ou redémarrez-le)? Assurez-vous que c'est UTF8 pas utf8Quel est le résultat de
cat ~/.psqlrc
etcat /etc/psqlrc
?Je sais que vous êtes à la recherche pour le côté serveur par défaut, mais sur le client, vous pouvez définir un OS envvar:
export PGCLIENTENCODING=UTF8
le faire pour tous les utilisateurs (sur machine), placez-le dans
/etc/profile
Ajoutant
client_encoding = 'UTF8'
à/etc/postgresql/9.1/main/postgresql.conf
et le redémarrage de Postgres avec/etc/init.d/postgresql restart
a eu aucun effet. Client de codage pour les nouvelles connexions est encoreLATIN1
. Définition de la variable d'environnement a fait un travail, mais comme vous l'avez dit c'est spécifique au client. Peut-être "assez bon" pour mon cas, bien que les...OriginalL'auteur Neil McGuigan