目录
[1 设置集群默认的字符集编码](#1 设置集群默认的字符集编码)
[2 设置数据库的字符集编码](#2 设置数据库的字符集编码)
[1 查看数据字符集编码](#1 查看数据字符集编码)
[2 查看服务端字符集](#2 查看服务端字符集)
[3 查看客户端字符集](#3 查看客户端字符集)
[4 查看默认的排序规则和字符分类](#4 查看默认的排序规则和字符分类)
PostgreSQL里面的字符集支持你能够以各种字符集存储文本,包括单字节字符集,比如 ISO 8859 系列,以及多字节字符集 ,比如EUC(扩展 Unix 编码 Extended Unix Code)、UTF-8 和 Mule 内部编码。所有被支持的字符集都可以被客户端透明地使用,但少数只能在服务器上使用(即作为一种服务器方编码)。默认的字符集是在使用 initdb
初始化你的PostgreSQL数据库集簇时选择的。在你创建一个数据库时可以重载它,因此你可能会有多个数据库并且每一个使用不同的字符集。
但是,一个重要的限制是每个数据库的字符集必须和数据库的LC_CTYPE
(字符分类)和LC_COLLATE
(字符串排序顺序)设置兼容。对于 C
或POSIX
环境,任何字符集都是允许的, 但是对于其他libc提供的环境只有一种字符集可以正确工作(不过, 在Windows上UTF-8编码可以和任何环境配合使用)。 如果您配置了ICU支持,则ICU提供的区域设置可用于大多数服务器端编码, 但不能用于所有服务器端编码。
设置字符集
1 设置集群默认的字符集编码
initdb
为一个PostgreSQL集簇定义缺省的字符集(编码)。比如:把缺省字符集设置为EUC_JP
(用于日文的扩展Unix 编码)。
initdb -E EUC_JP
或者
initdb --encoding EUC_JP
如果没有给出-E
或者--encoding
选项,initdb
会尝试基于指定的或者默认的区域判断要使用的合适编码。
2 设置数据库的字符集编码
数据库创建时你指定一个非默认编码,提供的编码应和选择的区域兼容:
bash
createdb -E EUC_KR -T template0 --lc-collate=ko_KR.euckr --lc-ctype=ko_KR.euckr korean
或者SQL
CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;
注意:上述命令指定拷贝**template0
数据库**。在拷贝任何其他数据库时,不能更改从源数据库得来的编码和区域设置,因为这可能会导致破坏数据。
查看字符集
1 查看数据字符集编码
数据库的字符集存储在系统目录pg_database
中
bash
psql -l
或者
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-------------+----------+----------+-------------+-------------+-----------------------
db3 | postgres | UTF8 | en_US.UTF8 | en_US.UTF8 |
db4 | role1 | UTF8 | en_US.UTF8 | en_US.UTF8 |
db5 | role2 | UTF8 | en_US.UTF8 | en_US.UTF8 |
dbtemplate | postgres | UTF8 | en_US.UTF8 | en_US.UTF8 |
dbtemplate1 | postgres | UTF8 | en_US.UTF8 | en_US.UTF8 |
dbtemplate2 | postgres | UTF8 | en_US.UTF8 | en_US.UTF8 |
korean | postgres | EUC_KR | ko_KR.euckr | ko_KR.euckr |
postgres | postgres | UTF8 | en_US.UTF8 | en_US.UTF8 |
template0 | postgres | UTF8 | en_US.UTF8 | en_US.UTF8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF8 | en_US.UTF8 | =c/postgres +
| | | | | postgres=CTc/postgres
testdb | postgres | UTF8 | en_US.UTF8 | en_US.UTF8 |
(11 rows)
2 查看服务端字符集
bash
# 服务端字符集
postgres=# show server_encoding;
server_encoding
-----------------
UTF8
(1 row)
3 查看客户端字符集
bash
# 客户端字符集
postgres=# show client_encoding;
client_encoding
-----------------
UTF8
(1 row)
postgres=#
postgres=# \encoding
UTF8
4 查看默认的排序规则和字符分类
bash
# 字符分类
postgres=# show lc_ctype;
lc_ctype
------------
en_US.UTF8
(1 row)
# 排序规则
postgres=# show lc_collate;
lc_collate
------------
en_US.UTF8