- By test - In 猎人市场
23.3. 字符集支持#
23.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
这将创建一个名为 korean 的数据库,使用 EUC_KR 字符集和 ko_KR 区域设置。另一种实现此目的的方法是使用此 SQL 命令
CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;
请注意,上述命令指定复制 template0 数据库。复制任何其他数据库时,编码和区域设置不能从源数据库更改,因为这可能会导致数据损坏。有关更多信息,请参阅 第 22.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 设置所暗示的字符集,并且它将强制只使用匹配的数据库编码。在旧系统上,您有责任确保使用所选区域设置所期望的编码。此区域的错误很可能会导致依赖区域设置的操作(如排序)出现奇怪的行为。
PostgreSQL 允许超级用户创建 SQL_ASCII 编码的数据库,即使 LC_CTYPE 不是 C 或 POSIX。如上所述,SQL_ASCII 不会强制数据库中存储的数据具有任何特定编码,因此此选择存在依赖区域设置的错误行为的风险。使用此设置组合已被弃用,并且将来可能会完全禁止。

