client_encoding GBK 错误

108 views
Skip to first unread message

yuzhou...@163.com

unread,
Jun 7, 2008, 6:03:39 AM6/7/08
to PostgreSQL 8 DBA 專業指南中文版
createdb -p xxxx -U xxx -E UNICODE testdb

创建好testdb 后执行 psql -p xxxx -U xxx -l
列出 数据库列表.

我修改 postgresql.conf 中的 client_encoding = GBK
然后重新启动 postgrsql 服务。

再次执行 psql -p xxxx -U xxx -l 就错了

我的locale 是 zh_CN.UTF8

不知道怎么解决

老魚師

unread,
Jun 8, 2008, 10:27:32 PM6/8/08
to PostgreSQL 8 DBA 專業指南中文版
GBK - 不支持做服务器端编码
http://www.pgsqldb.org/pgsqldoc-8.1c/multibyte.html

您的問題可以閱讀下列範圍的文檔:
http://www.pgsqldb.org/pgsqldoc-8.1c/charset.html


On 6月7日, 下午6時03分, "yuzhouliu2...@163.com" <yuzhouliu2...@163.com>
wrote:

yuzhou...@163.com

unread,
Jun 9, 2008, 9:27:11 PM6/9/08
to PostgreSQL 8 DBA 專業指南中文版
我读过了,我在服务器上用的编码是unicode 不是gbk,
问题是,我如果改 client_encoding = GBK 后
用 psql -p xxxx -U xxx -l 就会报错。

老魚師

unread,
Jun 9, 2008, 11:31:07 PM6/9/08
to PostgreSQL 8 DBA 專業指南中文版
ChaoYi=# set client_encoding TO 'GBK';
ERROR: conversion between GBK and UTF8 is not supported

PostgreSQL 支持一些编码在服务器和前端之间的自动编码转换。 转换信息在系统表 pg_conversion 中存储。 你可以使用
SQL 命令 CREATE CONVERSION 创建一个新的转换。

On 6月10日, 上午9時27分, "yuzhouliu2...@163.com" <yuzhouliu2...@163.com>
wrote:

yuzhou...@163.com

unread,
Jun 10, 2008, 5:46:47 AM6/10/08
to PostgreSQL 8 DBA 專業指南中文版
我仔细测试了一下:
1. initdb -D /pgdata --locale=C
2. pg_ctl start -D /pgdata -o '-p 9999 -i'
3. createdb -p 9999 -U postuser -E UNICODE testdb
4. psql -p 9999 -U postuser -l
返回列表:
数据库列表
名字 | 所有者 | 编码
-----------+-----------+-----------
postgres | postuser | SQL_ASCII
template0 | postuser | SQL_ASCII
template1 | postuser | SQL_ASCII
testdb | postuser | UTF8
(4 行)

5.向数据库中建表,插入数据(其中有中文)
psql -p 9999 -U postuser -d testdb -q -f test.sql
执行成功,没有出现错误信息.

test.sql 内容如下:
SET client_encoding = 'GB18030';
SET check_function_bodies = false;
SET SESSION AUTHORIZATION 'postuser';
SET search_path = public, pg_catalog;

CREATE TABLE test (
iid serial NOT NULL,
name character varying,
code character varying
);

INSERT INTO test (iid, name, code) VALUES (1, '礽', NULL);
INSERT INTO test (iid, name, code) VALUES (2, '礽中国', 'testcode');
INSERT INTO test (iid, name, code) VALUES (3, '礽中国是什么陈致慜聚鑫物昊物甄拓鑫',
'testcode');
INSERT INTO test (iid, name, code) VALUES (4, '礽中国是什么陈致慜聚鑫物昊物甄拓鑫中打开打开
开裆裤的', NULL);


5.psql -p 9999 -U postuser -d testdb
psql =>
可以进入交互模式

6.在 交互模式中 查询表的数据(其中有中文)
psql => select * from test;
返回结果,可以正确显示中文

7.在 交互模式中 设置 encoding
psql =>\encoding GB18030
psql =>\set
AUTOCOMMIT = 'on'
VERBOSITY = 'default'
PROMPT1 = '%/%R%# '
PROMPT2 = '%/%R%# '
PROMPT3 = '>> '
DBNAME = 'testdb'
USER = 'postuser'
PORT = '9999'
ENCODING = 'GB18030'
HISTSIZE = '500'

证明成功

8.在 交互模式中 再次查询表的数据(其中有中文)
psql => select * from test;
返回结果,没有错误信息出现,但是结果列表为乱码.

9.在 交互模式中 执行 \l 命令:
psql => \l
ERROR: invalid byte value for encoding "SQL_ASCII": 0xe5

10.退出 交互模式,编辑postgresql.conf
client_encoding = GB18030
保存文件,重新启动数据库。
直接用psql 命令
psql -p 9999 -U postuser -l
ERROR: invalid byte value for encoding "SQL_ASCII": 0xe5
错误与 9 相同


我原来的linux 是 redhat 9.0 数据库是 postgresql 7.1.4
locale 命令返回为:
LANG=zh_CN.GB18030
LC_CTYPE="zh_CN.GB18030"
LC_NUMERIC="zh_CN.GB18030"
LC_TIME="zh_CN.GB18030"
LC_COLLATE="zh_CN.GB18030"
LC_MONETARY="zh_CN.GB18030"
LC_MESSAGES="zh_CN.GB18030"
LC_PAPER="zh_CN.GB18030"
LC_NAME="zh_CN.GB18030"
LC_ADDRESS="zh_CN.GB18030"
LC_TELEPHONE="zh_CN.GB18030"
LC_MEASUREMENT="zh_CN.GB18030"
LC_IDENTIFICATION="zh_CN.GB18030"
LC_ALL=

我新装的linux 为 Red Hat Enterprise Linux 5,自带数据库是 postgresql 8.1.4
locale 命令返回为:
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=



我原来的系统的上的数据库没有任何问题,上面的执行的过程完全一样。
换了新系统和数据库就不行了。

yuzhou...@163.com

unread,
Jun 10, 2008, 3:56:56 AM6/10/08
to PostgreSQL 8 DBA 專業指南中文版
Reply all
Reply to author
Forward
0 new messages