1、问题现象
在AIX服务器上使用gsql客户端查询GBK数据时,发现显示字符为乱码:

2、处理流程
在server端,使用同样的SQL进行查询发现是可以正常显示中文的

怀疑由于AIX字符集导致的问题,众所周知PG家族数据库,将系统及客户端软件字符集,dbclient端,dbserver端三者的字符集对齐后,就可以正常显示字符了。
查看数据库server库字符集:
select oid,pg_catalog.pg_encoding_to_char(encoding) server_encoding from pg_database where oid=294331;

AIX查看gsql客户端字符集
gsql -r
show client_encoding;

查看xshell软件的字符集

其实,到这里基本上已经可以确定是由于xshell的字符集设置导致了乱码的发生,将xshell的字符集设置为GBK后,果然可以显示中文了。


本以为这个案件到这里就结束了,但是后来用户又发来一个很奇怪的要求,要求AIX字符集必须是UTF8的,不能是GBK,好吧,用户是上帝。其实这个需求也不难,PG家族数据库第二个众所周知的特性是可以通过设置server_encoding和client_encoding,自动将部分字符集中进行转换。那么我们接下来要做的也就很简单,只要将server_encoding置为GBK,client_encoding和系统及xshell字符集置换为UTF,就可以实现中文的显示了。
先检查server_encoding参数,已经是GBK了
show server_encoding;

通过环境变量,设置client_encoding参数,将该参数设置为UTF8
export PGCLIENTENCODING=UTF8
gsql -c "show client_encoding"

检查系统可用的字符集,选中并将LANG设置为ZH_CH.UTF-8
locale -a export LANG=ZH_CH.UTF-8

再将xshell字符集显示为UTF8

截止到这里应该可以正常显示中文了,但是在简单测试后,发现居然还是乱码

这个结果明显不符合预期,之后思考了很久,还是打算从环境变量入手,在详细阅读了AIX关于字符集的环境变量资料后,发现使用locale可以输出当前关于字符集的所有环境变量输出。
locale

这其中,LC_ALL设置很奇怪,尝试为其配置为ZH_CH.UTF-8,乱码问题消失。
export LC_ALL=ZH_CN.UTF-8

至此,问题处理完毕。
3、总结及拾遗
该方法可同样适用于处理KylinOS,CentOS,Redhat等Linux服务器上显示乱码问题。




