数据库已设置为使用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)
哪个according to the docs应该已经导致客户端使用UTF8作为其默认的clIEnt_enCoding(强调我的):
clIEnt_enCoding (string)
Sets the clIEnt-sIDe enCoding (character set). The default is to use the database enCoding.
但它没有:
$sudo psql --dbname=application_databasepsql (9.1.19)Type "help" for help.application_database=# SHOW clIEnt_enCoding; clIEnt_enCoding----------------- latin1(1 row)
我甚至尝试过使用ALTER USER< user> SET …更改我登录的用户的默认配置:
application_database=# ALTER USER root SET clIEnt_enCoding='UTF8';ALTER RolEapplication_database=# SELECT usename,useconfig FROM pg_shadow; usename | useconfig----------------------+------------------------ postgres | root | {clIEnt_enCoding=UTF8} application_database |(3 rows)
但这也没有效果:
$sudo psql --dbname=application_databasepsql (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)
我系统上的任何Psql文件都没有:
vagrant@app-database:~$cat ~/.psqlrccat: /home/vagrant/.psqlrc: No such file or directoryvagrant@app-database:~$cat /etc/psqlrccat: /etc/psqlrc: No such file or directoryvagrant@app-database:~$sudo suroot@app-database:/home/vagrant# cat ~/.psqlrccat: /root/.psqlrc: No such file or directory
我正在运行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)好的,首先要做的事情是:为什么不设置用户或数据库编码有效?
事实证明这是因为the psql documentation这条线:
If at least one of standard input or standard output are a terminal,then psql sets the clIEnt enCoding to “auto”,which will detect the appropriate clIEnt enCoding from the locale settings (LC_CTYPE environment variable on Unix systems). If this doesn’t work out as expected,the clIEnt enCoding can be overrIDden using the environment variable PGCLIENTENCoding.
所以,实际上,您以前的配置更改实际上已经起作用,而不是在交互式psql控制台中.请尝试以下命令:
sudo psql --dbname=application_database -c "SHOW clIEnt_enCoding;" | cat
您应该看到客户端编码实际上是UTF8:
clIEnt_enCoding----------------- UTF8(1 row)
现在再次运行命令,但没有将它传递给cat:
sudo psql --dbname=application_database -c "SHOW clIEnt_enCoding;"
你应该得到结果:
clIEnt_enCoding----------------- latin1(1 row)
所以基本上,psql只对涉及终端的命令使用latin1编码.
你怎么解决这个问题?嗯,有几种可能的方法.
一个是按照文档建议做的,并将PGCLIENTENCoding环境变量设置为UTF8某处持久化,例如〜/ .profile或〜/ .bashrc只影响您的用户,或/ etc / environment影响整个系统(参见How to permanently set environmental variables) ).
另一种选择是将系统区域设置配置为使用en_US.utf8而不是en_US(或等效).执行此 *** 作的方法可能因系统而异,但通常可以通过修改〜/ .config / locale.conf(仅限您的用户)或/ etc / default / locale或/etc/locale.conf(系统 – 来实现).宽).这将不仅仅影响postgres,我相信更紧密地解决问题的根源.您可以通过运行locale
来检查当前的区域设置.
另一种解决方案是更新psqlrc文件以包含SET clIEnt_enCoding = UTF8;.该文件位于〜/ .psqlrc(仅限您的用户)或/ etc / psqlrc(系统范围).请注意,此方法不会影响我们之前用于客户端编码的命令的结果,因为the docs state(强调我的):
总结
--command=command
SpecifIEs that psql is to execute one command string,command,and then exit. This is useful in shell scripts. Start-up files (
psqlrc
and~/.psqlrc
) are ignored with this option.
以上是内存溢出为你收集整理的postgresql – 如何更改Postgres中的默认client_encoding?全部内容,希望文章能够帮你解决postgresql – 如何更改Postgres中的默认client_encoding?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)