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数据库。如果复制 任何其他数据库,就不能更改源数据库的编码和区域设置,因为这可能导致数 据损坏。详见Section 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)

Important

在大多数现代操作系统上,PostgreSQL能够 判断LC_CTYPE设置所隐含的字符集,并强制只允许使用与之 匹配的数据库编码。在较老的系统上,你需要自行确保所用编码正是所选区域 设置期望的编码。这里的错误很可能会导致区域设置相关操作(例如排序)出 现奇怪的行为。

即使LC_CTYPE不是C或 POSIX,PostgreSQL 仍允许超级用户创建使用SQL_ASCII编码的数据库。正如 前文所述,SQL_ASCII并不强制数据库中存储的数据具 有任何特定编码,因此这种选择存在区域设置相关误行为的风险。这种设置组 合已经被弃用,未来某一天可能会被完全禁止。