initdb 为一个 PostgreSQL 集群定义缺省的字符集,比如:
initdb -E EUC_JP
把缺省字符集设置为 EUC_JP(用于日文的扩展 Unix 编码)。如果你喜欢用长选项声明的话,可以用 --encoding 代替 -E 选项。如果没有给出 -E 或 --encoding 选项,initdb 将基于制定的区域或者缺省区域试图判断合适的编码。
你可以创建一个有着不同编码的数据库:
createdb -E EUC_KR korean
将创建一个使用 EUC_KR 字符集的名字叫 korean 的数据库。另外一种实现方法是使用 SQL 命令:
CREATE DATABASE korean WITH ENCODING 'EUC_KR';
数据库的编码是存储在 pg_database 系统表中的。你可以用 psql 的 -l 选项或 \l 命令列出这些编码。
$ psql -l
List of databases
Database | Owner | Encoding
---------------+---------+---------------
euc_cn | t-ishii | EUC_CN
euc_jp | t-ishii | EUC_JP
euc_kr | t-ishii | EUC_KR
euc_tw | t-ishii | EUC_TW
mule_internal | t-ishii | MULE_INTERNAL
postgres | t-ishii | EUC_JP
regression | t-ishii | SQL_ASCII
template1 | t-ishii | EUC_JP
test | t-ishii | EUC_JP
utf8 | t-ishii | UTF8
(9 rows)
【重要】虽然你可以给一个数据库声明你需要的任何编码,但选择一个与你选择的区域不一致的编码还是不妥的做法。LC_COLLATE 和 LC_CTYPE 设置暗示一个特定的编码,与区域相关的操作(比如排序)在不兼容的编码里很有可能产生错误的解析。
因为这些区域设置都是由 initdb 冻结的,所以在不同的数据库里使用不同的编码更多是理论而不是现实。这些机制很有可能在将来版本的 PostgreSQL 得到改进。
一个安全使用多种编码的方法是在 initdb 的时候把区域设置为 C 或 POSIX ,这样就关闭了任何实际的区域敏感性。