常遇到的字符乱码如:
1) 使用图形界面或命令行控制台安装程序在安装数据库时,中文信息乱码;
2) Linux下,使用企业管理器/查询分析器/逻辑备份还原工具/控制管理器/ksql工具等,从服务器返回的错误中文信息是乱码,如登陆数据库密码或用户名错误的信息,逻辑备份成功或失败的信息都是有乱码;
3) 打开kls、kingbase的log文件,显示出来的中文信息是乱码;
4) 查询分析器中粘贴过来的中文信息是乱码,SQL无法继续执行。
工作原理
如下图,
Kingbase:服务器服务线程,包括输出信息写线程;
工具:包括查询分析器、ksql等,字符集编码由clientencoding指定;
LOG:包括kingbase.log,kls.log等,字符集编码根据数据库字符集而定
数据库:包括DB1、DB2等,字符集编码由用户指定,UNICODE、GBK等;
.PO文件:存放服务器消息的一个二进制文件,字符集编码是GBK。
1)kingbase根据数据库编码serverencoding将从po文件读出的GBK字符串转成数据库编码serverencoding,并将访问该数据库产生的编码为serverencoding的字符串刷到log中。图示中有 两个从DB1和DB2产生的log信息输出到kingbase.log中;
2)kingbase根据客户端编码clientencoding将从po文件读出的GBK字符串转化成客户端编码clientencoding,然后将编码为clientencoding的字符串刷到查询分析器/ksql等客户端。图示中 为将信息输出到查询分析器等工具。
3)要显示正常中文必须保证:操作系统编码、Kingbase服务器的LOG输出编码(服务器系统内默认指定编码为GBK,而对数据库的访问log是根据所访问数据库的serverencoding来决定输出编码的)、终端显示编码三者一致。
4)当系统接受连接前,kingbase服务器使用的是操作系统的编码输出LOG,因此,输出的LOG的信息是正常的;当接受连接后,服务器使用的是1)中方式输出log。
原因追踪
1)kingbase服务器系统默认字符集是GBK,所以安装时候输出信息为GBK编码,而一般操作系统默认字符集为UTF8,所以字符界面安装的时候因输出与操作系统、终端显示的字符集不一致,导致安装时候的中文信息为乱码。
2)原因同1),新版本在打开企业管理器/查询分析器/逻辑备份还原工具/控制管理器时已经默认将LANG修改为GBK,所以新版本应该不会出现这个问题,除非操作系统不支持GBK中文字符集。
3)log信息不能正常显示的原因主要是操作系统字符集编码、Kingbase服务器的LOG输出编码与终端显示编码三者不一致。如果log中某段信息是访问DB1,则如果要查看该段log,需要保证操作系统、终端显示字符集都与DB1字符编码一致,如果查看访问DB2的某段log信息,则须保证操作系统、终端显示字符集都与DB2字符编码保持一致。Log中的第一部分license信息与操作系统字符集一致。
4)查询分析器中粘贴过来的中文信息是乱码,多是由于粘贴的原文件字符集与查询分析器默认字符集不一致造成。
解决办法
1) 开始安装前修改操作系统字符集和终端显示字符集。
[root@hlzhu1 ~]# export LANG=zh_CN.GB18030
修改终端字符编码为GB18030或GBK,【终端】-【设定字符编码】- 【简体中文GB18030】。
2) 使用命令行方式打开企业管理器等工具,且在启动工具之前修改操作系统字符集和终端显示字符集。
[root@hlzhu1 ~]# export LANG=zh_CN.GB18030
然后cd到$KINGBASE_HOME/bin目录下,执行命令./javatools.sh ./JManager或者…/jre/bin/java –jar ./JManager.jar启动工具。
3) 使用VI打开的情况下,参照1)解决方法,例如查看访问数据库DB1的log,要保持操作系统字符集、终端字符集与DB1字符集一致。
4) 在查询分析器中修改client_encoding为拷贝字符的字符集,或者将拷贝的内容先通过记事本周转一下,再贴到查询分析器中。