LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1287|回复: 9

suse9下PostgreSQL数据库乱码,RedHat9好好的

[复制链接]
发表于 2003-11-9 21:53:07 | 显示全部楼层 |阅读模式
大家的情况怎么样
发表于 2003-11-9 22:07:03 | 显示全部楼层
该数据库的缺省编码系统示什么?Unicode?如果与客户端不同,可能会出现这样的问题。

说地太含糊,帮不倒你。
 楼主| 发表于 2003-11-9 22:23:07 | 显示全部楼层
是安装时默认的编码,中文乱码,英文正常
发表于 2003-11-9 23:28:02 | 显示全部楼层
不大可能出现这个情况吧?
 楼主| 发表于 2003-11-10 08:26:43 | 显示全部楼层
用select语句一次查询多行记录,所有汉字都变成了一长串数字 感觉suse9不如redhat9对中文的支持好,我都想删掉suse9装fedora了
发表于 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.
 楼主| 发表于 2003-11-10 10:36:13 | 显示全部楼层
谢谢,我重安装试试
 楼主| 发表于 2003-11-10 10:41:10 | 显示全部楼层
感激不尽!我正在下载Fedora,suse9的PostgreSQL能调试好就不装它了,呵呵
发表于 2003-11-10 10:42:48 | 显示全部楼层
那就好,那就好。记得要加油哦。
发表于 2003-11-10 10:44:02 | 显示全部楼层
气愤。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表