作者:瀚高PG实验室 (Highgo PG Lab)- 波罗
虽然PG支持客户端和服务器端的编码自动转换,但是还需要遵从一个原则:
本地环境的编码和客户端编码需一致。
1)通过HighgoDB数据库的SQL Shell(psql)连接数据库服务器
Server [localhost]: 192.168.137.222
Database [highgo]: testdb
Port [5866]: 5432
Username [highgo]: postgres
Client Encoding [GBK]: UTF8
用户 postgres 的口令:
psql (4.1.1)
PSQL: Release 4.1.1
Connected to:
HighGo Database V4.1 Enterprise Edition Release 4.1.1 - 64-bit Production
输入 "help" 来获取帮助信息.
2)PostgreSQL的数据库postgres,服务器端字符编码为utf8,客户端工具psql字符编码为GBK,本地环境dos命令编辑器编码为GBK,此时:
testdb=#create table tt(name text); #创建测试表
testdb=# show server_encoding;
server_encoding
-----------------
UTF8
(1 行记录)
testdb=# show client_encoding;
client_encoding
-----------------
GBK
(1 行记录)
testdb=# \! chcp
活动代码页: 936 #936为简体中文,GBK;
testdb=#insert into tt values('测试');
testdb=# select * from tt;
name
------
测试
(1 行记录)
由于本地环境和客户端编码都是GBK,一致,没有问题;
insert时,客户端接收本地环境输入的GBK字符(两者都为GBK),客户端传到服务器端时自动转换为UTF-8编码存储,没有问题;
select时,服务器端传到客户端,UTF-8编码自动转换为GBK编码,在本地环境显示时,本地环境就是GBK编码,显示没有问题。
3)PostgreSQL的数据库postgres,服务器端字符编码为utf8,客户端工具psql字符编码为utf8,本地环境dos命令编辑器编码为GBK,此时:
testdb=# set client_encoding to 'utf8';
SET
testdb=# insert into test values('测试1');
ERROR: invalid byte sequence for encoding "UTF8": 0xb2
testdb=# select * from tt;
column1
--------------------
娴嬭瘯
(1 行记录)
由于客户端和服务器的编码一致,故不进行转码,
insert时,本地输入的GBK编码到psql客户端不自动转换,客户端把接收的字符作为utf编码传给服务器端不转换,GBK的编码作为UTF-8存储,故有问题。
报错的信息为:ERROR: invalid byte sequence for encoding “UTF8”: 0xb2;
select时,服务端的utf编码传给客户端不转换,客户端把utf编码传给本地环境不自动转换,utf8编码用gbk编码显示,故有问题。