Postgresql 之 编码自动转换原则与乱码显示原因

虽然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编码显示,故有问题。

by boluo

你可能感兴趣的:(Highgo,DB,PostgreSQL)