DB2 load显示乱码/关于codepage

本文详细探讨了DB2数据库出现乱码的原因,涉及数据库编码页、操作系统编码、db2codepage变量及LOAD、IMPORT操作的影响。通过实例分析,解释了如何避免和解决乱码问题,强调了正确指定输入文件编码页的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常而言,db2的输出显示乱码,都是字符编码的问题。
查看数据库的编码集:
[test@demo ~]$ db2 get db cfg for testdb|grep -i code
 Database code page                                      = 1208
 Database code set                                       = UTF-8

 Database country/region code                            = 1
[test@demo ~]$ db2 get db cfg for testdb|grep -i terr
 Database territory                                      = US
数据库的编码集codeset在创建的时候就指定的,一旦创建后就无法修改,codepage是
db2内部对编码集数字表示,可理解为db2为字符编码集另起的一个代号,只在db2内部
意义,常用是1208对应UTF-8编码集,1386对应GBK编码集,819对应ISO8859-1
DB2支持的codepage官方文档如下:
https://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.admin.nls.doc/doc/r0004565.html
UTF-8与其他编码集通常是兼容可以转换的,如1208与819,1208与1386是兼容可以互相转
换的,但是1386与819是不兼容的。

乱码显示与操作系统的编码集,db2codepage注册变量设置的编码集,还有create db指定
的数据库的编码集都有关系。
操作系统的编码:
[test@demo db2cfg]$ locale
LANG=en_US.UTF-8
db2codepage注册变量设置的编码集
[test@demo db2cfg]$ db2set db2codepage=1208
[test@demo db2cfg]$ db2set -all
[i] DB2CODEPAGE=1208
create db指定的数据库的编码集:
[test@demo ~]$ db2 get db cfg for testdb|grep -i code
 Database code page                                      = 1208
 Database code set                                       = UTF-8

客户端访问数据库时候,如果不设定db2codepage,客户端是通过客户端操作系统的locale获得
编码页的,如果设置db2codepage注册变量,那就使db2codepage指定的编码页。
修改数据到数据库中和select数据输出显示,其实就是客户端使用的编码页和数据库编码页之间的
转换。
1.设置DB2CODEPAGE为1208,插入中文,输出正常:
[test@demo ~]$ db2set -all
[i] DB2CODEPAGE=1208
[test@demo ~]$ db2 "insert into tb1 values(1208,'呀')"
DB20000I  The SQL command completed successfully.
[test@demo ~]$  db2 "select * from tb1"

ID          NAME
----------- ----------
       1208 呀     ---->正确输出中文
  1 record(s) selected.

2.设置db2codepage为1386,插入中文,显示乱码:
[test@demo ~]$ db2set db2codepage=1386
[test@demo ~]$ db2set -all
[i] DB2CODEPAGE=1386
[test@demo ~]$ db2 terminate
[test@demo ~]$  db2 "insert into tb1 values(1386,'呀')"
DB20000I  The SQL command completed successfully.

1386行->输入的'呀'实际上是一个UTF-8的编码字符,但是通过db2codepage硬指定了
             db2codepage=1386 GBK告诉DB2"呀"是使用GBK编码的,导致于数据库没办
             法正确执行编码页转换,加载错误的数据到数据库内,
             所以输出时候,不管设置是db2codepage=1386还改为1208(第3步测试),输出都是乱码,
             所以在insert/update插入数据时候一定指定正确编码集,db2才能正确执行编码页转换,
             才能加载正确数据到数据库中,如果加载的数据都是错误的,那输出显示肯定乱码
1208行>之前insert的1208行现在也显示乱码,是因为设置了db2codepage=1386,输出时db2
             要把源编码页1208(即数据库编码页)转换目标编码页db2codepage=1386(GBK)来显示,
             因为系统设置的是UTF-8,所以汉字显示了乱码

3.设置db2codepage改回来1208,1208行正常了,1386行依然乱码:
[test@demo db2cfg]$ db2set db2codepage=1208
[test@demo db2cfg]$ db2set -all
[i] DB2CODEPAGE=1208
[test@demo ~]$ db2 terminate

****************************************************************************************************************
下面测试编码对load和import DEL格式数据的影响:
load默认认为输入文件是使用数据库codepage编码的,如果输入文件的编码与数据库codepage不一致,
经过编码页转化后,将会将错误的数据装载到数据库中,导致于select输出显示乱码。
load认为输入文件使用的编码集:
1.在load命令里使用modified by codepage=<codepage>选项来告诉load程序输入文件的codepage
2.如果1没有指定,默认输入文件是使用的是数据库codepage编码

import认为输入文件使用的编码集:
1.import命令里明示指定文件的编码页modified by codepage=<codepage>
2.若果1没有指定,若设置了db2set db2codepage=xxx,则使用db2codepage,
3.如果2也没有指定,默认输入文件使用当前客户端的操作系统编码集

测试环境的数据库编码页是1208,设置的注册变量db2codepage=1208
[test@demo ~]$ db2 get db cfg for testdb|grep -i code
 Database code set                                       = UTF-8
[test@demo db2cfg]$ db2set db2codepage=1208

[test@demo ~]$ db2 "select * from tb1"
ID          NAME
----------- ----------
       1208 呀

db2 "export to tb1 of del select * from tb1"
db2 "export to t1386 of del modified by codepage=1386 select * from tb1"
db2 "export to t819 of del modified by codepage=819 select * from tb1
"

db2 delete from tb1
db2 "import from tb1 of del  insert into tb1"   ----->输出正常
db2 "import from t1386 of del insert into tb1" ----->t1386文件是1386编码集,与db2set db2codepage=1208不一致,乱码
---->t1386文件是1386编码集,指定了modified codepage=1386告知db2输入文件的正确codepage,加载数据正确,输出正常
db2 "import from t1386 of del modified by codepage=1386 insert into tb1"
---->中文显示不了,819编码不支持中文,导出时候文件内容就有问题了
db2 "import from t819 of del modified by codepage=819 insert into tb1"

Load也是一样的原理,不一 一测试,
对于load和import,重要的是一定要正确指定的输入文件的codepage,DB2才能正确进行编码页转换,
才能加载正确的数据到数据库中.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值