22.3.2. 设置字符集
initdb为一个PostgreSQL
集群定义缺省的字符集(编码),比如:
initdb -E EUC_JP
把缺省字符集设置为EUC_JP(用于日文的扩展Unix编码)。
如果你喜欢用长选项声明的话,可以用--encoding代替-E选项。
如果没有给出-E或者--encoding选项,
initdb将基于指定的或者缺省的区域试图判断合适的编码。
你可以在数据库创建时指定非缺省编码,但是指定的编码必须与所选的区域相兼容:
createdb -E EUC_KR -T template0 --lc-collate=ko_KR.euckr --lc-ctype=ko_KR.euckr korean
将创建一个使用EUC_KR字符集以及ko_KR区域的
名字叫korean的数据库。另外一种实现方法是使用SQL命令:
CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;
注意上述命令声明拷贝template0数据库。当拷贝任何其他数据库时,
来自源数据库的编码和区域设置不能被改变,因为可能导致数据损坏。参阅第 21.3 节
获取更多信息。
数据库的编码是存储在pg_database系统表中的。
你可以用psql的-l选项或\l
命令列出这些编码。
$ psql -l
List of databases
Name | Owner | Encoding | Collation | Ctype | Access Privileges
-----------+----------+-----------+-------------+-------------+-------------------------------------
clocaledb | hlinnaka | SQL_ASCII | C | C |
englishdb | hlinnaka | UTF8 | en_GB.UTF8 | en_GB.UTF8 |
japanese | hlinnaka | UTF8 | ja_JP.UTF8 | ja_JP.UTF8 |
korean | hlinnaka | EUC_KR | ko_KR.euckr | ko_KR.euckr |
postgres | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 |
template0 | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | {=c/hlinnaka,hlinnaka=CTc/hlinnaka}
template1 | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | {=c/hlinnaka,hlinnaka=CTc/hlinnaka}
(7 rows)
重要:
在大多数现代操作系统中,PostgreSQL可以通过
LC_CTYPE的设置决定使用哪种字符集,并且强制只使用匹配的数据库编码。在旧的操作系统上
你有责任确保使用所选区域所期望的编码。
如果这上面犯错误很可能导致与区域相关的操作表现出古怪的行为,比如排序。
即使当LC_CTYPE不是C或者POSIX时,
PostgreSQL也允许超级用户创建
使用SQL_ASCII编码的数据库。正如
以上所述,SQL_ASCII不强制存储在数据库中的数据
具有任何特定的编码,所以这个选择带来
区域相关的不当行为的风险。使用这样的设置组合是不推荐的,也许有一天会被完全禁止。