一、 查看字符集
pg 10中支持的字符集,及服务段和客户端之间的自动字符集转换规则参考 /docs/10/
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
参考
postgresql中设置默认编码_welcome to daijiguo's blog-****博客_postgresql 编码设置
/docs/10/
PostgreSQL字符集问题导致乱码_10931853的技术博客_51CTO博客