pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
Tatsuo Ishii(<ishii@postgresql.org>), 最后更新于 2000-03-22。 更多信息请查看Tatsuo 的 网站。
多字节(MB)支持旨在让 PostgreSQL能够处理 多字节字符集,例如EUC(扩展 Unix 编码)、Unicode 和 Mule 内部编码。启用MB后,你可以在正则表达式 (regexp)、LIKE 以及其他一些函数中使用多字节字符集。默认 编码系统是在使用initdb初始化 PostgreSQL安装时选定的。注意,这可以在你 使用createdb创建数据库或使用 SQL 命令 CREATE DATABASE时被覆盖。因此你可以拥有多个数据库, 并让每个数据库使用不同的编码系统。
在运行 configure 时带上多字节选项:
./configure --enable-multibyte[=encoding_system]
其中encoding_system可以是下表中的值之一:
表 5.1. 字符集编码
| 编码 | 描述 |
|---|---|
SQL_ASCII |
ASCII |
EUC_JP |
日语 EUC |
EUC_CN |
中文 EUC |
EUC_KR |
韩语 EUC |
EUC_TW |
台湾 EUC |
UNICODE |
Unicode(UTF-8) |
MULE_INTERNAL |
Mule 内部编码 |
LATIN1 |
ISO 8859-1 ECMA-94 拉丁字母 No.1 |
LATIN2 |
ISO 8859-2 ECMA-94 拉丁字母 No.2 |
LATIN3 |
ISO 8859-3 ECMA-94 拉丁字母 No.3 |
LATIN4 |
ISO 8859-4 ECMA-94 拉丁字母 No.4 |
LATIN5 |
ISO 8859-9 ECMA-128 拉丁字母 No.5 |
LATIN6 |
ISO 8859-10 ECMA-144 拉丁字母 No.6 |
LATIN7 |
ISO 8859-13 拉丁字母 No.7 |
LATIN8 |
ISO 8859-14 拉丁字母 No.8 |
LATIN9 |
ISO 8859-15 拉丁字母 No.9 |
LATIN10 |
ISO 8859-16 ASRO SR 14111 拉丁字母 No.10 |
ISO-8859-5 |
ECMA-113 拉丁/西里尔 |
ISO-8859-6 |
ECMA-114 拉丁/阿拉伯 |
ISO-8859-7 |
ECMA-118 拉丁/希腊 |
ISO-8859-8 |
ECMA-121 拉丁/希伯来 |
KOI8 |
KOI8-R(U) |
WIN |
Windows CP1251 |
ALT |
Windows CP866 |
在PostgreSQL 7.2 之前,LATIN5错误地 表示 ISO 8859-5。从 7.2 开始, LATIN5表示 ISO 8859-9。如果你有一个在 7.1 或更早 版本上创建的LATIN5数据库,并且想迁移到 7.2(或 更高版本),就应该非常小心这个变化。
并非所有 API 都支持上面列出的编码。例如, PostgreSQL的 JDBC 驱动不支持 MULE_INTERNAL、LATIN6、 LATIN8和LATIN10。
这里有一个把PostgreSQL默认配置为使用日语编码的例子:
$ ./configure --enable-multibyte=EUC_JP
如果省略了编码系统(./configure --enable-multibyte),则假定使用SQL_ASCII。
initdb为PostgreSQL 安装定义默认编码。例如:
$ initdb -E EUC_JP
这会把默认编码设为EUC_JP(日语的扩展 Unix 编码)。 注意,如果你喜欢较长的选项形式,也可以用--encoding代 替-E。如果既没有给出-E也没有给出 --encoding,就使用在 configure 时指定的编码。
你可以创建使用不同编码的数据库:
$ createdb -E EUC_KR korean
这会创建一个名为korean的数据库,使用 EUC_KR编码。另一种实现方式是使用 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)
对于某些编码,PostgreSQL支持在服务器和客 户端之间进行自动编码翻译。可用的组合列在 表 5.2中。
表 5.2. 客户端/服务器字符集编码
| 服务器编码 | 可用的客户端编码 |
|---|---|
SQL_ASCII |
SQL_ASCII, UNICODE, MULE_INTERNAL |
EUC_JP |
EUC_JP, SJIS, UNICODE, MULE_INTERNAL |
EUC_TW |
EUC_TW, BIG5, UNICODE, MULE_INTERNAL |
LATIN1 |
LATIN1, UNICODE MULE_INTERNAL |
LATIN2 |
LATIN2, WIN1250, UNICODE, MULE_INTERNAL |
LATIN3 |
LATIN3, UNICODE MULE_INTERNAL |
LATIN4 |
LATIN4, UNICODE MULE_INTERNAL |
LATIN5 |
LATIN5, UNICODE MULE_INTERNAL |
LATIN6 |
LATIN6, UNICODE MULE_INTERNAL |
LATIN7 |
LATIN7, UNICODE MULE_INTERNAL |
LATIN8 |
LATIN8, UNICODE MULE_INTERNAL |
LATIN9 |
LATIN9, UNICODE MULE_INTERNAL |
LATIN10 |
LATIN10, UNICODE MULE_INTERNAL |
ISO_8859_5 |
ISO_8859_5, UNICODE |
ISO_8859_6 |
ISO_8859_6, UNICODE |
ISO_8859_7 |
ISO_8859_7, UNICODE |
ISO_8859_8 |
ISO_8859_8, UNICODE |
ISO_8859_9 |
ISO_8859_9, WIN, ALT, KOI8R, UNICODE, MULE_INTERNAL |
UNICODE |
EUC_JP, SJIS, EUC_KR, EUC_CN, EUC_TW, BIG5, LATIN1 to LATIN10, ISO_8859_5, ISO_8859_6, ISO_8859_7, ISO_8859_8, WIN, ALT, KOI8 |
MULE_INTERNAL |
EUC_JP, SJIS, EUC_KR, EUC_CN, EUC_TW, BIG5, LATIN1 to LATIN5, WIN, ALT, WIN1250 |
KOI8 |
ISO_8859_9, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL |
WIN |
ISO_8859_9, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL |
ALT |
ISO_8859_9, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL |
若要启用自动编码转换,必须告诉PostgreSQL 你希望客户端使用哪种编码。有几种方法可以做到这一点。
在psql中使用\encoding 命令。\encoding允许动态更改客户端编码。例如,要把 编码改成SJIS,可以输入:
\encoding SJIS
使用libpq函数。 \encoding实际上就是为此目的调用 PQsetClientEncoding()的。
int PQsetClientEncoding(PGconn *conn, const char *encoding)
其中conn是到服务器的连接, encoding是你想使用的编码。如果成功设置了编码,它返回 0, 否则返回 -1。此连接的当前编码可以通过下面的函数得到:
int PQclientEncoding(const PGconn *conn)
注意它返回的是编码 ID,而不是像EUC_JP这样的符号字符串。 要把编码 ID 转换为编码名,可以使用:
char *pg_encoding_to_char(int encoding_id)
使用SET CLIENT_ENCODING TO。 可以使用以下 SQL 命令设置客户端编码:
SET CLIENT_ENCODING TO 'encoding';
也可以为此使用 SQL92 语法SET NAMES:
SET NAMES 'encoding';
要查询当前客户端编码:
SHOW CLIENT_ENCODING;
要返回到默认编码:
RESET CLIENT_ENCODING;
使用PGCLIENTENCODING。 如果在客户端环境中定义了PGCLIENTENCODING环境变量,那么连接服务器时会自动选择该客户端编码。(之后仍可以用上面提到的任何其他方法覆盖它。)
从PostgreSQL 7.1 开始支持 Unicode 与其他编码之间的自动编码翻译。在 7.1 中它默认不启用。要启用这个特性,运行 configure 时带上--enable-unicode-conversion选项。注意这还要求同时带--enable-multibyte选项。
对于 7.2,--enable-unicode-conversion不再必要。只要指定了--enable-multibyte,Unicode 转换功能就会自动启用。
假设你为服务器选择了EUC_JP ,为客户端选择了LATIN1, 那么某些日语字符无法翻译为LATIN1。在 这种情况下,无法用LATIN1字符集表示的字母 会被变换为:
(HEXA DECIMAL)
这些都是开始了解各种编码系统的良好资料。
对EUC_JP、EUC_CN、EUC_KR、EUC_TW的详细说明见 3.2 节。
Unicode Consortium 的网站
UTF-8 在这里定义。
Dec 7, 2000
* 实现了 Unicode 与其他编码之间的自动编码转换
* 以上变更将出现在 7.1 中
May 20, 2000
* SJIS UDC(NEC 选定 IBM 汉字)支持,由 Eiji Tokuya 贡献
* 以上变更将出现在 7.0.1 中
Mar 22, 2000
* 新增 libpq 函数 PQsetClientEncoding、PQclientEncoding
* ./configure --with-mb=EUC_JP
已废弃。请改用 ./configure --enable-multibyte=EUC_JP
* 新增 SQL_ASCII 回归测试用例
* 新增 SJIS 用户自定义字符(UDC)支持
* 以上全部将出现在 7.0 中
July 11, 1999
* 新增对 WIN1250(Windows 捷克语)作为客户端编码的支持(由 Pavel Behal 贡献)
* 修复一些编译器警告(由 Tomoaki Nishiyama 贡献)
Mar 23, 1999
* 新增对 KOI8(KOI8-R)、WIN(CP1251)、ALT(CP866) 的支持(感谢 Oleg Broytmann 测试)
* 修复 MB 与 locale 相关的问题
Jan 26, 1999
* 新增 Big5 作为前端编码的支持(要使用 Big5,需用 EUC_TW 创建数据库)
* 新增 EUC_TW 的回归测试用例(由 Jonah Kuo <jonahkuo@mail.ttn.com.tw>)
Dec 15, 1998
* 修复了与 SQL_ASCII 支持相关的一些错误
Nov 5, 1998
* 6.4 发布。此版本中,pg_database 增加了表示数据库编码的 "encoding" 列
Jul 22, 1998
* 在 initdb/createdb 时确定编码,而非编译时
* 在发出 COPY 命令时支持 PGCLIENTENCODING
* 支持 SQL92 语法 "SET NAMES"
* 支持 LATIN2-5
* 新增 UNICODE 回归测试用例
* 新的 MB 测试套件
* 清理源代码文件
Jun 5, 1998
* 新增后端与前端之间的编码转换支持
* 新增 SET CLIENT_ENCODING 等新命令
* 新增 LATIN1 字符集支持
* 增强 8 位洁净性
April 21, 1998 一些增强/修复
* character_length()、position()、substring() 现在能识别多字节字符
* 新增 octet_length()
* 为 configure 新增 --with-mb 选项
* 新的 EUC_KR 回归测试(由 Soonmyung Hong 贡献)
* 为 EUC_JP 回归测试新增一些测试用例
* 修复 System V 情况下 regress/regress.sh 中的问题
* 修复 toupper()、tolower() 以处理 8 位字符
Mar 25, 1998 MB PL2 被并入 PostgreSQL 6.3.1
Mar 10, 1998 PL2 发布
* 为 EUC_JP、EUC_CN 和 MULE_INTERNAL 新增回归测试
* 新增一份英文文档(本文件)
* 修复与 8 位单字节字符有关的问题
Mar 1, 1998 PL1 发布
Windows 客户端平台上的 WIN1250 字符集可以配合启用了区域支持的 PostgreSQL使用。
应记住以下几点:
成功与否取决于正确的系统区域设置。这已经在Red Hat 6.0和Slackware 3.6上用 cs_CZ.iso8859-2区域测试过。
决不要尝试把服务器的数据库编码设为 WIN1250。 始终改用 LATIN2,因为 Unix 中没有 WIN1250 区域。
WIN1250 编码只对 Windows ODBC 客户端可用。 字符会被动态转码,以便正确显示和存回。
Windows/ODBC 上的 WIN1250
在启用区域支持、服务器端编码设为LATIN2的情况下编译 PostgreSQL。
设置你的安装。不要忘记在环境中创建区域变量。例如(这可能 不适用于你的环境):
LC_ALL=cs_CZ.ISO8859-2
必须带着区域设置启动服务器!
用捷克语试一试,并在查询上进行排序。
在你的 Windows 机器上为PostgreSQL安装 ODBC 驱动。
正确设置你的数据源。在 ODBC 配置对话框的Connect Settings字段中加入这一行:
SET CLIENT_ENCODING = 'WIN1250';
现在再试一次,但这次是在带 ODBC 的 Windows 中。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。