20.2. 字符集支持

PostgreSQL 里面的字符集支持 你能够以各种字符集存储文本,包括单字节的字符集,比如 ISO 8859 系列和 EUC (扩展 Unix 编码 Extended Unix Code),Unicode 和 Mule 国际编码.所有字符集都可以在服务器上透明地使用。 (如果你使用了来自其它数据源地扩展函数,那么它取决于他们是否正确 地书写了代码。)缺省的字符集是在使用 initdb 初始化 你的 PostgreSQL 数据库集群的时候选择的。 在你的使用 createdb 或者 SQL 命令 CREATE DATABASE 的时候是可以覆盖这个缺省的。因此,你可以有多个数据库,每个都有不同 的字符集。

20.2.1. 支持字符集编码

Table 20-1 显示了可以用在服务器的字符集。

Table 20-1. 服务器字符集

名字描述
SQL_ASCIIUS ASCII
EUC_JP日文 EUC
EUC_CN中文 EUC
EUC_KR韩文 EUC
JOHAB韩文 EUC (Hangle base)
EUC_TW台湾 EUC
UNICODEUnicode(UTF-8)
MULE_INTERNALMule 内部编码
LATIN1ISO 8859-1 ECMA 94 Latin Alphabet No.1
LATIN2ISO 8859-2 ECMA 94 Latin Alphabet No.2
LATIN3ISO 8859-3 ECMA 94 Latin Alphabet No.3
LATIN4ISO 8859-4 ECMA 94 Latin Alphabet No.4
LATIN5ISO 8859-9 ECMA 128 Latin Alphabet No.5
LATIN6ISO 8859-10 ECMA 144 Latin Alphabet No.6
LATIN7ISO 8859-13 (Latin Alphabet No.7)
LATIN8ISO 8859-14 (Latin Alphabet No.8)
LATIN9ISO 8859-15 (Latin Alphabet No.9)
LATIN10ISO 8859-16 ASRO SR 14111 (Latin Alphabet No.10)
ISO_8859_5ECMA 113 (Latin/Cyrillic)
ISO_8859_6ECMA 114 (Latin/Arabic)
ISO_8859_7ECMA 118 (Latin/Greek)
ISO_8859_8ECMA 121 (Latin/Hebrew)
KOI8KOI8-R(U)
WINWindows CP1251
ALTWindows CP866
WIN1256Windows CP1256 (Arabic)
TCVNTCVN-5712/Windows CP1258 (Vietnamese)
WIN874Windows CP874 (Thai)

Important: PostgreSQL7.2 之前, LATIN5错误地表示 ISO 8859-5 的意思. 从 7.2 开始 LATIN5表示 ISO8859-9. 如果你有一个在 7.1 或者之前创建的 使用了 LATIN5的数据库, 而且你希望移植到 7.2(或者以后的版本), 那么你必须非常仔细地注意这个变化.

并非所有API支持上面列出的编码.比如, PostgreSQL JDBC 驱动就不支持MULE_INTERNALLATIN6LATIN8LATIN10

20.2.2. 设置字符集

initdb 为一个 PostgreSQL 集群定义缺省的字符集,比如:

initdb -E EUC_JP

把缺省字符集设置为 EUC_JP (用于日文的扩展的 Unix 编码). 如果你喜欢用长选项声明的话,你可以用 --encoding 代替 -E. 如果没有给出-E或者--encoding选项, 则使用SQL_ASCII

你可以创建一个有着不同编码的数据库:

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
 regression    | t-ishii | SQL_ASCII
 template1     | t-ishii | EUC_JP
 test          | t-ishii | EUC_JP
 unicode       | t-ishii | UNICODE
(9 rows)

20.2.3. 服务器和客户端之间的自动字符集转换

PostgreSQL 支持一些编码 在服务器和前端之间的自动编码转换. 转换信息在系统表 pg_conversion 中存储。 你可以使用 SQL 命令 CREATE CONVERSION 创建一个 新的转换。PostgreSQL带着一些预定义的转换。它们在 Table 20-2 中列出.

Table 20-2. 客户/服务器字符集转换

服务器字符集可用客户端字符集
SQL_ASCIISQL_ASCII, UNICODE, MULE_INTERNAL
EUC_JPEUC_JP, SJIS, UNICODE, MULE_INTERNAL
EUC_CNEUC_CN, UNICODE, MULE_INTERNAL
EUC_KREUC_KR, UNICODE, MULE_INTERNAL
JOHABJOHAB, UNICODE
EUC_TWEUC_TW, BIG5, UNICODE, MULE_INTERNAL
LATIN1LATIN1, UNICODE, MULE_INTERNAL
LATIN2LATIN2, WIN1250, UNICODE, MULE_INTERNAL
LATIN3LATIN3, UNICODE, MULE_INTERNAL
LATIN4LATIN4, UNICODE, MULE_INTERNAL
LATIN5LATIN5, UNICODE
LATIN6LATIN6, UNICODE, MULE_INTERNAL
LATIN7LATIN7, UNICODE, MULE_INTERNAL
LATIN8LATIN8, UNICODE, MULE_INTERNAL
LATIN9LATIN9, UNICODE, MULE_INTERNAL
LATIN10LATIN10, UNICODE, MULE_INTERNAL
ISO_8859_5ISO_8859_5, UNICODE, MULE_INTERNAL, WIN, ALT, KOI8
ISO_8859_6ISO_8859_6, UNICODE
ISO_8859_7ISO_8859_7, UNICODE
ISO_8859_8ISO_8859_8, UNICODE
UNICODE EUC_JP, SJIS, EUC_KR, UHC, JOHAB, EUC_CN, GBK, EUC_TW, BIG5, LATIN1 to LATIN10, ISO_8859_5, ISO_8859_6, ISO_8859_7, ISO_8859_8, WIN, ALT, KOI8, WIN1256, TCVN, WIN874, GB18030, WIN1250
MULE_INTERNALEUC_JP, SJIS, EUC_KR, EUC_CN, EUC_TW, BIG5, LATIN1LATIN5, WIN, ALT, WIN1250 BIG5, ISO_8859_5, KOI8
KOI8ISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL
WINISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL
ALTISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL
WIN1256WIN1256, UNICODE
TCVNTCVN, UNICODE
WIN874WIN874, UNICODE

要想打开自动字符集转换功能,你必须告诉 PostgreSQL 你想在客户端使用的字符集(编码).你可以用好几种方法实现这个目的.

假如无法进行特定的字符转换 -- 比如, 你选的服务器编码是EUC_JP, 客户端是LATIN1,那么有些日文字符不能 转换成LATIN1.这时, 不能用LATIN1字符集表示的字母将被转换成 圆括弧包围的十六进制,像,(826C) 这样。

20.2.4. 进一步阅读

下面是学习各种类型的编码系统的好地方.

ftp://ftp.ora.com/pub/examples/nutshell/ujip/doc/cjk.inf

详细地解释了第3.2节出现的EUC_JPEUC_CNEUC_KREUC_TW

http://www.unicode.org/

Unicode 的家目录.

RFC 2044

定义了UTF-8.