Chinaunix首页 | 论坛 | 博客
  • 博客访问: 306908
  • 博文数量: 45
  • 博客积分: 1429
  • 博客等级: 上尉
  • 技术积分: 422
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-19 09:12
文章分类

全部博文(45)

文章存档

2021年(1)

2020年(1)

2019年(1)

2016年(4)

2015年(3)

2011年(4)

2010年(31)

我的朋友

分类: DB2/Informix

2019-07-31 00:25:35

db2之codepage、字符集
计算机处理文本时,把一门语言中每个字符都赋以特定的值,这种字符与数值的对照表就叫 codepage或字符集( IBM公司首先使用codepage,代码页等同于字符集 ) ,可理解成字符和字节数据的映射表。例如codepage一般用数字表示,字符集一般用字母表示,如下:
codepage                                        操作系统字符集
1383     D-4     IBM-eucCN     86         zh_CN                   AIX
1386     D-4     GBK               86         Zh_CN.GBK            AIX
1392     D-6     GB18030        86         Zh_CN.GB18030     AIX
1208     N-1     UTF-8            86         ZH_CN                  AIX
1386     D-4     GBK               86         zh_CN.GBK             Linux
1392     D-6     GB18030        86         zh_CN.gb18030      Linux


在DB2数据库中,与字符集相关的问题主要有三个层次的字符集的设置,其中系统级别和实例级别的字符集,可以根据需求进行修改,而数据库级别的数据集则必须在建库时确定。
(1)操作系统:系统级别的代码页设置,决定应用程序的默认代码页。 查看命令:locale;修改命令:export LANG=xxx
(2)实例级别:数据库实例级别的代码页设置,它会影响DB2相关应用程序对代码页转换时做出代码页判定。 查看命令: db2set -all;修改命令:db2set DB2CODEPAEG=1208
(3)数据库级别:DB2 数据库级别的代码页设置,必须在建库时进行设置codeset xxx,它是针对于此数据库对字符的内部编码。查看命令:db2 get db cfg | grep code ; 不可修改

db2中,codeset只是在数据库创建时指定,建完后数据库根本就不提供codeset这个参数给你改,所以你不可能改得了。db2数据库创建命令:CREATE DATABASE TESTDB1 USING CODESET UTF-8 TERRITORY CN
注:ERRITORY 参数指定两个或三个字母组成的地域标识(如CN、US、TW等)、CODESET的参数必须大写
codepage     codeset
819              ISO 8859-1
1208            UTF-8
1386            GBK
详解如下链接:



常用字符集或codepage介绍:
ISO 8859 
     国际标准组织(ISO)和国际电工委员会联合指定的一系列8位字符集标准,现包含15个字符集,如ISO 8859-1、ISO 8859-2等等。其实就是ASCII字符集,但是其他拉丁字母的语言有一定的变音字母或者特殊字母,故可以使用ASCII及控制字符以外区域来存储及表示,如汉字。ISO 8859-1编码表示的字符范围很窄,无法表示中文字符(除非显示的时候采用GBK格式),但是由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候仍旧采用ISO 8859-1编码表示。

GB2312
    收录6763个汉字,2字节编码,小于127编码与ASCII相同,两个字节表示一个汉字。在这些编码里,连ASCII里本来有的数字、标点、字母统统重新编了两个字节长度的编码,这就是常说的“全角”字符,而原来在127号以下的那些字符叫“半角”字符。(这就是全角和半角

GBK字符集
     GB2312编码 + BIG5 + 一些符号,共21003个字符

GB 18030
     国家制定的大字符集,推出汉字的“大统一”标准,共收录汉字70244。与UTF-8相同,采用多字节编码,GB18030每个字可以有1个、2个或4个字节组成。UTF-8则采用1个字节表示ASCII字母,3个字节表示汉字等等。

UTF-8
     Unicode的编码:一个英文字母 a 和 一个汉字 好,编码后都是占用的空间大小是一样的,都是两个字节!
     UTF8编码:一个英文字母a和 一个汉字 好 ,编码后占用的空间大小就不样了,前者是一个字节,后者是三个字节!
     UTF-8中表示的内容是 7位 的时候就用一个字节:0*******  第一个0为标志位,剩下的空间正好可以表示ASCII 0-127 的内容。
            当要表示的内容在 8 到 11 位的时候就用两个字节:110***** 10******  第一个字节的110和第二个字节的10为标志位。
            当要表示的内容在 12 到 16 位的时候就用三个字节:1110***** 10****** 10******    和上面一样,第一个字节的1110和第二、三个字节的10都是标志位,剩下的空间正好可以表示汉字。以此类推:
            四个字节:11110**** 10****** 10****** 10******
            五个字节:111110*** 10****** 10****** 10****** 10******
            六个字节:1111110** 10****** 10****** 10****** 10****** 10*****
 
不同codepage之间数据转换:
     问题1 :db2数据库与字符集之间的关系是?即如果系统的locale是GBK,而数据库的codepage是ISO 8859,那汉字如何存储和显示?
      答:db2数据与字符集主要有三个层次的字符集设置,系统、实例、数据库codeset,详见本文开头部分。
             应用程序将数据插入数据库过程中的代码转换: 
                    应用程序数据字符集(系统字符集)(显示或文件) 《----转成---> db2实例级codepage 《-----转成--> db2数据库codeset 
             注1: 反之从数据库中将数据导出也是从相反流程。因此,尽量将db2实例和db2数据库codeset设置成一致,最完美的三者一致。不同系统之间的locale也会导致文件打开或显示乱码。系统字符集和db2实例的codepage设置成一致???
             注2:字符集之间的转换的前提条件是它们属于同一个组或者它们满足以下关系:
                      1、单字节(S)组可以转换成中型(N)组(存在中文时会乱码),但N组不一定能转成S组。
                      2、双字节(D)组可以转换成中性(N)组,但N组不一定能转成D组。
                      3、单字节(S)不可以转换成双字节(D)组。(此条个人理解,因codeset为ISO8859,export使用codepage=1386修饰无效)
codepage                                        操作系统字符集
819       S-1     ISO8859-1     86                                     AIX
1383     D-4     IBM-eucCN     86         zh_CN                   AIX
1386     D-4     GBK               86         Zh_CN.GBK            AIX
1392     D-6     GB18030        86         Zh_CN.GB18030     AIX
1208     N-1     UTF-8            86         ZH_CN                  AIX
1386     D-4     GBK               86         zh_CN.GBK             Linux
1392     D-6     GB18030        86         zh_CN.gb18030      Linux

     问题2:是否可以将不用codeset的数据库数值相互导入(在表结构类似的情况下)?方法是?
       答:可以,前提是codeset满足字符集之间的转换条件,如上问题所说的。
              方法有三种:
               1. LOAD
                   缺省情况下,load认为输入文件是用数据库codeset编码的,直接将文件转化成字节导入数据库。若输入文件的codepage与数据库的不同,需用通过指定codepage修饰符来提示load程序进行代码转换。
               2. IMPORT del文件
                   缺省情况下import程序认为输入文件中使用当前数据库实例级代码页编码的。若输入文件的codepage和数据库实例的codepage不一致,通过db2set DB2CODEPAEG=输入文件的代码页并db2 terminate后导入输入文件,完成导入后在改回原来的实例级代码页或者导入时指定codepage修饰符来提示import程序输入文件的codepage(import from xx of del modified by codepage=文件的代码页)
               3. IMPORT ixf文件
                   ixf格式在导出的文件里面已经包括了文件的codepage(IXF模式在导出的时候可以指定CODEPAGE),因此导入的时候db2会自己检测到相应的codepage然后使用正确的方式导入,因此对于IXF格式,一般不会出现编码问,因为会发生自动编码转换。对于DEL格式,当在不同系统间export/import/load数据时,由于数据的编码不同,可能会遇到汉字乱码问题。但是,codepage为ISO 8859的ixf文件导入codeset为UTF-8时,若含中文字符则乱码;导入至codeset为GBK时,因代码页无法转换而导入失败,解决办法使用del格式+codepage修饰符的import。

db2set命令介绍:
     db2set命令是用于修改db2实例级别的注册变量(profile registies),profile registries要比实例的configuration parameters要大一点,比系统环境变量小一点。
     1. db2set -lr //列出所有支持的profile registries
     2. db2set registry_variable = value //设值
         例如:db2set db2comm=TCPIP
     3. db2set registry_variable = //恢复成默认值
          db2set db2comm=
     4. db2set -all //列出当前设置过的变量
         例如:[e]  DB2DBDFT=workdb
                   [i]  DB2CODEPAGE=819
                   [g]  DB2_EEE_LICENSE_POLICY=21874613
          注:[e]表示是操作系统级别的环境变量
                 [i]表示实例级别定义的变量
                 [g]表示在全局对该系统上的所有实例上定义
阅读(6331) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~