关于DB2CODEPAGE的总结
1名词解释
DB2 CODEPAGE:数据库代码页,通过命令db2 get db cfg for dbname|grep -i 'Database code set'可以查看,一般为1208(UTF-8);
DB2CODEPGE:DB2数据库注册表变量,默认为与操作系统一致;
OS CODEPAGE:操作系统代码页,LINUX和UNIX为819(en_US),WINDOWS为936(ANSI/OEM - 简体中文 GBK)。LINUX和UNIX系统查看CODEPAGE的方法:在终端输入locale或echo $LANG;WINDOWS查看CODEPAGE方法:在cmd.exe输入chcp,或者右键cmd.exe属性查看。
SecureCRT的编码:指SecureCRT的字符编码。
ZH_CN.UTF-8字符集:字符编码是UTF-8的,能显示中文,时间、数字等的表达是中国人传统使用的表达方式。
如果通过db2set设置了数据库服务端和客户端的DB2CODEPAGE,那么在数据库层面就不用关注OS CODEPAGE了,因为DB2CODEPAGE的优先级比OS CODEPAGE高,能够覆盖OS CODEPAGE的影响。
下面讲的OS CODEPAGE是指没有设置DB2CODEPAGE,如果设置了DB2CODEPAGE,那么下面讲到的OS CODEPAGE都以DB2CODEPAGE为准。
2select的处理
如果是SELECT,显示到屏幕的CODEPAGE会经过这样的转换,DB2 CODEPAGE→OS CODEPAGE→SecureCRT的编码(如果SecureCRT的编码和OS CODEPAGE不一致,会出现乱码,但这只是显示上的乱码,真正的数据没有被破坏),这些转换的基础是字符集之间可以转换,有些字符集之间不能转换,可以查看http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.nls.doc/doc/r0004565.html。
例子:
Hqbbdb的DB2 CODEPAGE为1208,DB2CODEPGE为1208,执行
db2 "select cust_no,substr(cust_name,1,20) cust_name from db2ohqbb.ACC_CUST"|more,返回结果中中文都是乱码,如下:

这是因为SecureCRT的编码不是UTF-8,与DB2CODEPAGE(也就是OS CODEPAGE,已经被DB2CODEPAGE覆盖)不一致,解决方式为对SecureCRT的编码进行设置,选择—会话选项—外观—字符编码,把字符编码由Default修改为UTF-8,然后确定,如图一。
(图一)
再次执行如上语句,结果如下:

3insert和update的处理
如果是insert与update,会经过这样的转换,OS CODEPAGE(在insert和update时,此处是数据编码的源头,不要考虑被DB2CODEPAGE覆盖的事)->DB2CODEPAGE-> DB2 CODEPAGE,当前设置分别为ZH_CN.UTF-8->1208->1208,执行结果如下:

界面看到的虽然为乱码,但插入到数据库的内容是正确的,这就是为什么UTF-8无BOM格式的sql文件通过db2 –tvf xxx.sql执行,界面输出为乱码,但插入到数据库的内容是正确的原因,如果想让界面也能正常显示这些字符的编码,只要参考图一对SecureCRT的编码的进行设置。
相反,如果OS CODEPAGE为819,SecureCRT的编码设置为1208,这样能够在界面正常显示输入的中文,但插入到数据库的却是乱码,因为转换路径为:OS CODEPAGE->DB2CODEPAGE-> DB2 CODEPAGE ,即819(en_US)-8->1208->1208,而819是无法对中文字符编码的,所以此处开始就为乱码,到数据库就是乱码了。例子如下:


4导出的处理
export、db2move export导出的数据默认使用OS CODEPAGE(被DB2CODEPGE覆盖)进行存储。
5导入的处理
import、load 、db2move import、db2move load,默认导入文件是以OS CODEPAGE(被DB2CODEPGE覆盖)存储的,如果文件存储使用的CODEPAGE和OS CODEPAGE不一致,入库后的数据会被破坏,出现乱码,只能重新导入。所以,保险的就是在导出和导入时都显示指定CODEPAGE,比如modified by codepage=1208,表示导出的文件编码为1208、导入的文件编码为1208。
6最佳实践
对一系列参数进行如下设置,可确保正确输出输入中文及进行文件交互:
DB2 CODEPAGE=1208
DB2CODEPGE=1208
OS CODEPAGE在.profile(ksh加载的的环境变量文件)设置LANG,方法为:export.UTF-8
SecureCRT的编码设置为UTF-8,设置方法见图一。
导出和导入时都显示指定CODEPAGE,比如modified by codepage=1208,表示导出的文件编码为1208、导入的文件编码为1208。

供稿 | 黄海 编辑 | lin





