【摘抄】DB2字符集问题

三个层次的字符集  

在DB2数据库中,与字符集相关的问题主要有三个层次的字符集的设置,其中系统级别和实例级别的字符集可以根据需求进行修改,而数据库级别的数据集则必须在建库时确定。
  (1)操作系统 Locale:系统级别的代码页设置,决定应用程序的默认代码页;
  假如大家希望将 OS Locale 设置为中文,可以考虑下面的方法:
  UNIX:大家可以通过 export LANG=”zh_CN” 命令修改当前的 Locale 到中文;
  Windows:在“开始->设置->控制面板->区域选项”中进行对系统的语言设置进行选择;
  (2)DB2CODEPAGE:DB2 实例级别的代码页设置,它会影响DB2相关应用程序对代码页转换时做出代码页判定。
  大家可以通过 db2set DB2CODEPAEG= 命令将 DB2CODEPAGE 设置为你需要的字符集。
  (3)DATABASE CODEPAGE:DB2 数据库级别的代码页设置;必须在建库时进行设置。
  大家在创建数据库时必须指定需要的代码页:
  db2 "CREATE DATABASE dbname USING CODESET UTF-8 TERRITORY CN"
  注释:这条语句可用于创建指定区域为中国(CN)的 Unicode 数据库。

客户端字符集

db2的字符集是数据库上的特性,同一个实例下的数据库可以有各自不同的字符集,例如:

create database testdb on ‘e:’ using codeset gbk territory cn with ‘baal”s test db’

则会创建一个1386(cn)的数据库

当客户端连接到数据库的时候,他们的字符集要相互兼容,否则就会报下边类似的错误:

$ db2 connect to lord
SQL0332N  Character conversion from the source code page “819″ to the target
code page “1386″ is not supported.  SQLSTATE=57017

上边的错误则说明server端的字符集是819的,而客户端的字符集是1386(cn)的,db2不能server端819的字符集转化为client端1386的字符集。解决这个问题的思想是将client端的字符集改为与server端兼容的:

例如上例可以将client端字符集改为819或者1208(utf-8),步骤:

$ db2set db2codepage=819               —–或者Unicode(UTF-8) 1208
$ db2set db2country=US
$ db2 terminate
$ db2stop force
$ db2start

这样客户端的字符集就变为819活着1208,再连接就不会报错。

其他说明

对于中文,尽量使用GBK字符集,而不是UTF-8,因为后者一个汉字长度为3而不是2。

   1: create database ktzpdbusing codeset UTF8 territory cn create database ktzpdb using codeset UTF8 territory cn

  这样就把数据库或每张表的字符编码设为utf8了,当我们直接用mysql或db2自带的命令窗口去插入中文时,却不能插入,这就是命令窗口的编码问题了。

  一般命令窗口的字符编码应该为gbk,这样我们才能正常的插入和显示。如Mysql中可以用配置文件my.ini制定gbk,也可以在窗口中打set names gbk;

  DB2中在命令窗口中打 db2set DB2CODEPAGE=1386。当我们敲中文插数据进去时,实际上表数据就是以utf8存储的,而在命令窗口下由于设置成了gbk,我们就能正常看到中文了。

  当用mysql中 source d:/insertData.sql或用db2中的db2 -tf d:/**.sql 这种执行sql文件的命令时,该sql必须和当前命令窗口的字符编码一致,就是上述的gbk,可用记事本另存为ANSI即行。如果sql编码不一致,如是 utf8,那么客户端的gbk不能识别文件中的utf8编码格式,是不能存储中文或其他非英文字符的。

  总之,如果用了自带的命令窗口,MySql的导入文件的编码必须和命令窗口的字符编码一致,否则里面的数据中的中文字符等无法正常识别,而DB2的命令窗口一般还是设成1386,即GBK就行,文件也是ANSI格式的,不会出错!

原文地址:https://www.cnblogs.com/tukzer/p/2487043.html