如何更改Postgres中的默认client_encoding?

Aje*_*i32 7 postgresql postgresql-9.1

我正在尝试更改client_encoding我正在运行的PostgreSQL数据库的配置变量的默认值.我想要它UTF8,但目前它正在设置LATIN1.

数据库已设置为使用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)
Run Code Online (Sandbox Code Playgroud)

其中根据文档应该已经导致使用UTF-8作为其默认的客户端client_encoding(重点煤矿):

client_encoding (string)

设置客户端编码(字符集).默认是使用数据库编码.

但它没有:

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

application_database=# SHOW client_encoding;
 client_encoding
-----------------
 LATIN1
(1 row)
Run Code Online (Sandbox Code Playgroud)

我甚至尝试使用ALTER USER <user> SET ...更改我登录用户的默认配置:

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)
Run Code Online (Sandbox Code Playgroud)

但这也没有效果:

$ 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)
Run Code Online (Sandbox Code Playgroud)

我系统上的任何PSQL文件都没有:

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
Run Code Online (Sandbox Code Playgroud)

我正在运行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)
Run Code Online (Sandbox Code Playgroud)

Aje*_*i32 14

好的,首先要做的事情是:为什么不设置用户或数据库编码有效?

事实证明这是因为psql文档中的这一行:

如果标准输入或标准输出中的至少一个是终端,则psql将客户端编码设置为"auto",这将从区域设置(Unix系统上的LC_CTYPE环境变量)检测适当的客户端编码.如果这不能按预期工作,则可以使用环境变量PGCLIENTENCODING覆盖客户端编码.

因此,事实上,以前的配置变化实际上已经在努力,只是没有在交互式psql控制台.请尝试以下命令:

sudo psql --dbname=application_database -c "SHOW client_encoding;" | cat
Run Code Online (Sandbox Code Playgroud)

您应该看到客户端编码实际上是UTF8:

 client_encoding
-----------------
 UTF8
(1 row)
Run Code Online (Sandbox Code Playgroud)

现在再次运行该命令,但不管道它cat:

sudo psql --dbname=application_database -c "SHOW client_encoding;"
Run Code Online (Sandbox Code Playgroud)

你应该得到结果:

 client_encoding
-----------------
 LATIN1
(1 row)
Run Code Online (Sandbox Code Playgroud)

所以基本上,psql只LATIN1对涉及终端的命令使用编码.

你怎么解决这个问题?嗯,有几种可能的方法.

一个是按照文档建议做的,并将PGCLIENTENCODING环境变量设置为UTF8持久性,例如~/.profile~/.bashrc仅影响您的用户,或/etc/environment影响整个系统(请参阅如何永久设置环境变量).

另一种选择是将系统区域设置配置为使用en_US.utf8而不是en_US(或等效).执行此操作的方法可能因系统而异,但通常可以通过修改~/.config/locale.conf(仅限您的用户)/etc/default/locale/etc/locale.conf(系统范围)来实现.这将不仅仅影响postgres,我相信更紧密地解决问题的根源.您可以通过运行检查当前的区域设置locale.

另一个解决方案是更新你的psqlrc文件以包含SET client_encoding=UTF8;.该文件位于~/.psqlrc(仅限您的用户)或/etc/psqlrc(系统范围).请注意,此方法不会影响我们之前用于客户端编码的命令的结果,因为文档状态(强调我的):

--command=command

指定psql将执行一个命令字符串,命令,然后退出.这在shell脚本中很有用.使用此选项将忽略启动文件(psqlrc~/.psqlrc).


Nei*_*gan 5

你设置client_encodingpostgresql.conf(和重新加载配置或重新启动)?确保它是 UTF8 而不是 utf8

cat ~/.psqlrc和的结果是cat /etc/psqlrc什么?

我知道您正在寻找服务器端默认值,但在客户端上,您可以设置操作系统 envvar:

export PGCLIENTENCODING=UTF8

要为所有用户(在该机器上)执行此操作,请将其放入 /etc/profile