DB2数据库存在三种级别的字符集:操作系统级LANG、实例级(客户端级)db2codepage、数据库级Database code page/set。
操作系统级是用户应用程序使用的代码页。可以使用环境变量LANG=C等来设置。用set命令、或者echo $LANG查看其值。
实例级DB2应用程序进行客户端到数据库服务端代码页转换时使用的,比如使用SQL脚本时,db2读取脚本时就是按照实例级的字符集db2codepage来识别该脚本的。可用db2set -all来查看其值。可用db2set db2codepage=1208来设置其值。
数据库级的字符集是在创建数据库时指定的,是后续不可修改的。设置语句类似db2 "CREATE DATABASE dbname USING CODESET UTF-8 TERRITORY CN"。可以在连库后,使用db2 get db cfg for dbname命令,来查看Database code page/set的值。
本问题中数据库级的字符集是1386,即GBK字符集;终端实例级的字符集也是1386字符集。但是,SQL脚本是UTF-8格式的,db2按照1386字符集去读取UTF-8格式的脚本就会出现不可识别的乱码,最终报错SQL0010N。
解决办法是临时修改实例级字符集为UTF-8格式,执行完脚本后再恢复为GBK格式。
db2 connect to dbname
db2set db2codepage=1208
db2 terminate
db2 connect to dbname
db2 -tvf *.sql //执行sql脚本
db2set db2codepage=1386
db2 terminate
操作系统级是用户应用程序使用的代码页。可以使用环境变量LANG=C等来设置。用set命令、或者echo $LANG查看其值。
实例级DB2应用程序进行客户端到数据库服务端代码页转换时使用的,比如使用SQL脚本时,db2读取脚本时就是按照实例级的字符集db2codepage来识别该脚本的。可用db2set -all来查看其值。可用db2set db2codepage=1208来设置其值。
数据库级的字符集是在创建数据库时指定的,是后续不可修改的。设置语句类似db2 "CREATE DATABASE dbname USING CODESET UTF-8 TERRITORY CN"。可以在连库后,使用db2 get db cfg for dbname命令,来查看Database code page/set的值。
本问题中数据库级的字符集是1386,即GBK字符集;终端实例级的字符集也是1386字符集。但是,SQL脚本是UTF-8格式的,db2按照1386字符集去读取UTF-8格式的脚本就会出现不可识别的乱码,最终报错SQL0010N。
解决办法是临时修改实例级字符集为UTF-8格式,执行完脚本后再恢复为GBK格式。
db2 connect to dbname
db2set db2codepage=1208
db2 terminate
db2 connect to dbname
db2 -tvf *.sql //执行sql脚本
db2set db2codepage=1386
db2 terminate