postgresql 字符集查看及修改

一、 查看字符集

pg 10中支持的字符集,及服务段和客户端之间的自动字符集转换规则参考 http://www.postgres.cn/docs/10/multibyte.html

1. 服务器实例字符集

postgres=# show server_encoding;
 server_encoding 
-----------------
 UTF8

2. 数据库字符集

postgres=# \l
-- 或者
postgres=# select datname,pg_encoding_to_char(encoding) as encoding from pg_database;

3. 客户端字符集

postgres=# show client_encoding;
 client_encoding 
-----------------
 UTF8

-- 或者

postgres=# \encoding
UTF8

二、 设置字符集

1. 服务器实例字符集

仅在实例初始化时可以设置

initdb -D /data_dir -E UTF8 --locale=en_US.utf8
  • -E encoding 或 --encoding=encoding
    选择模板数据库的编码方式,这将是以后创建的数据库时的默认编码方式,除非在创建数据库时显示覆盖。这个值默认是从区域设置(--locale)中获得的,如果未进行区域设置,默认是SQL_ASCII。
  • --locale=locale
    设置服务器实例区域,默认来自initdb运行的操作系统环境

初始化后修改会报错

postgres=# alter system set server_encoding = 'UTF8';
ERROR:  parameter "server_encoding" cannot be changed

如果在实例初始化时设错了字符集又无法重新初始化,一个workaround是drop template1库,指定编码重建

UPDATE pg_database SET datistemplate=FALSE WHERE datname='template1';
DROP DATABASE template1;
CREATE DATABASE template1 WITH owner=postgres template=template0 encoding='UTF8';
UPDATE pg_database SET datistemplate=TRUE WHERE datname='template1';

 

2. 数据库字符集

  • 使用createdb命令创建时指定
createdb -E EUC_KR -T template0 --lc-collate=ko_KR.euckr --lc-ctype=ko_KR.euckr korean
  • 使用sql创建db时指定

注意以下命令指定拷贝template0数据库。在拷贝任何其他数据库时,不能更改从源数据库得来的编码和区域设置,因为这可能会导致破坏数据。

CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;

 

3. 客户端字符集

  • 操作系统层设置
export PGCLIENTENCODING=GBK
  • 或者db中设置
set client_encoding to 'utf8';
-- 或者
\encoding GBK

 

参考

https://blog.csdn.net/daijiguo/article/details/82767789

http://www.postgres.cn/docs/10/multibyte.html

https://blog.51cto.com/wujianwei/1979023

发布了295 篇原创文章 · 获赞 35 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Hehuyi_In/article/details/105207784