|
发表于 2003-11-10 10:33:30
|
显示全部楼层
关于POSTGRESQL地编码:
1. 在CONFIGURE安装时默认为ASCII。可以加 --enconding -multibyte=EUC_CN。不过这只是为以后创建数据库做默认而已,可以不加encding.
2. 编译、安装后,创建数据库命令createdb也有选项 --enconding=,你地问题就在这里了。
3. 我 猜你地数据库编码为ASCII,在console窗口是没法转换成汉字的。
别说Redhat,一样的结果了,兄弟。关键问题在createdb时的编码选项。
推荐你看篇官方文章:
5.2. 多字节支持
作者: Tatsuo Ishii, 最后更新:2000-03-22. 参考 Tatsuo 的 网站 获取更多信息.
多字节支持 (MB)是为了让 Postgres 能够处理多字节字符集,比如 EUC (扩展 Unix 编码 Extended Unix Code),Unicode 和 Mule 国际编码.把 MB 打开,你就能在正则表达式(regexp) LIKE,和一些其它函数里使用多字节字符集了. 缺省的编码系统是在你用 initdb 初始化 Postgres 系统安装的时候 确立的.请注意这个缺省是可以在使用 createdb 或者 SQL 命令 CREATE DATABASE 创建数据库的时候覆盖的.所以你可以拥有多个有着不同编码系统的数据库.
MB 同时还修补了一些与 8 位单字符集相关的问题,其中 包括ISO8859.(我不敢说我修补了所有问题.我只能说有了这个补丁以后 蜕变测试运行得很好,而且还可以使用几个法文字符.如果你在使用 8-位字符碰到任何问题,请告诉我.)
5.2.1. 打开 MB
带着多字节选项运行 configure:
% ./configure --enable-multibyte[=encoding_system]
这里 encoding_system 可以是下表中的一个 值:
Table 5-1. Postgres 字符集编码
编码 描述
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 英文及一些欧洲语言
LATIN2 ISO 8859-2 英文及一些欧洲语言
LATIN3 ISO 8859-3 英文及一些欧洲语言
LATIN4 ISO 8859-4 英文及一些欧洲语言
LATIN5 ISO 8859-5 英文及一些欧洲语言
KOI8 KOI8-R
WIN Windows CP1251
ALT Windows CP866
下面是一个配置例子,把 Postgres 配置为缺省为日文编码:
% ./configure --enable-multibyte=EUC_JP
如果忽略编码系统(./configure --enable-multibyte), 那么假设为 SQL_ASCII.
5.2.2. 设置编码
initdb 为一次 Postgres 安装定义缺省的编码系统,比如:
% initdb -E EUC_JP
把缺省编码设置为 EUC_JP(用于日文的扩展的 Unix 编码). 如果你喜欢用长选项声明的话,你可以用 "--encoding" 代替 "-E". 如果没有给出 -E 或者 --encoding 选项,则使用在编译时声明的 编码.
你可以创建一个有着不同编码的数据库:
% 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)
5.2.3. 前后端之间的自动编码转换
Postgres 支持一些编码 后端之间的自动编码转换.
Table 5-2. Postgres Client/Server 字符集编码
服务器编码 可用客户端编码
EUC_JP EUC_JP, SJIS
EUC_TW EUC_TW, BIG5
LATIN2 LATIN2, WIN1250
LATIN5 LATIN5, WIN, ALT
MULE_INTERNAL EUC_JP, SJIS, EUC_KR, EUC_CN, EUC_TW, BIG5, LATIN1 to LATIN5, WIN, ALT, WIN1250
要想打开编码转换功能,你必须告诉 Postgres 你想在前端使用的编码.你可以用好几种方法实现这个目的.
*
用 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)
请注意它只返回"编码标识",而不是象 "EUC_JP" 这样的编码符号字串. 要把编码标识转换为编码符号,你可以用:
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 环境变量, 那么在进行后端联接时将自动选择客户端编码. (这个编码随后可以用上面谈到的任何其它方法覆盖.)
5.2.4. 关于 Unicode
自 7.1 起开始 PostgreSQL 支持 Unicode 和其它编码之间的自动转换 .因为它需要巨大的转换表,所以缺省时是没有打开的. 要打开这个特性,带着 --enable-unicode-conversion 选项运行 configure.请注意它也要求使用 --enable-multibyte 选项.
5.2.5. 如果不能转换会怎样?
假设你的后端的编码是 EUC_JP,前端是 LATIN1,那么有些日文字符不能 转换成 LATIN1.这时,不能用 LATIN1 字符集表示的字母将被转换成:
(HEXA DECIMAL)
5.2.6. 参考
下面是学习各种类型的编码系统的好地方.
*
ftp://ftp.ora.com/pub/examples/nutshell/ujip/doc/cjk.inf 详细地解释了第3.2节出现的 EUC_JP,EUC_CN,EUC_KR,EUC_TW.
*
Unicode: http://www.unicode.org/ UNICODE 的家目录.
*
RFC 2044 定义了UTF-8. |
|