WEB开发网
开发学院数据库DB2 论 LOAD 与 IMPORT 中的 codepage 转换 阅读

论 LOAD 与 IMPORT 中的 codepage 转换

 2010-07-23 00:00:00 来源:WEB开发网   
核心提示:引言在 DB2 中,LOAD 与 IMPORT 作为重要的导入数据的工具,论 LOAD 与 IMPORT 中的 codepage 转换,有着很重要的作用,理想情况下,图 10. 查询结果 8结束语本文介绍了 LOAD,IMPORT 在不同情况下的 codepage 转换,为了获得最佳性能,应用程序与从该应用程序调用的语

引言

在 DB2 中,LOAD 与 IMPORT 作为重要的导入数据的工具,有着很重要的作用。理想情况下,为了获得最佳性能,应用程序与从该应用程序调用的语句始终应使用相同的代码页。在一些场景中,我们需要导入一些和数据库本身的 codepage 不一致的数据,这个时候就需要 codepage 转换了。DB2 产品支持代码页转换,从而允许应用程序和数据库使用不同的代码页。那么什么是 codepage ? DB2 支持那些 codepage 转化? 如何进行 codepage 转换呢?

Codepage 介绍

计算机处理文本时,把一门语言中每个字符都赋以特定的值,这种字符与数值的对照表就叫 codepage( 代码页 ) 。例如 ASCII 就是把英文字母表和一些控制字符映射到一些特定的数值上去。

DB2 支持的 codepage 列表

关于 DB2 支持的 codepage 可以在 DB2 信息中心中查看:

http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=/com.ibm.db2.luw.admin.nls.doc/doc/r0004565.html

在表中,每个 codepage 都有相对应的组,地域代码,代码集等。如果两个 codepage 属于同一个组,则它们可以互相转换,否则不可以互相转换。值得注意的是单字节(S)组可以转换成中性(N)组,双字节(D)组也可以转换为中性(N)组。但是 N 组不一定能转成 S 组,N 组也不一定成转成 D 组。

制造不同 CODEPAGE 数据的方式

制造不同 codepage 数据的方法有很多种。以下列出 4 种:

1. 使用 db2 export。DB2 本身 EXPORT 支持导出各种不同 codepage 的 DEL 格式的文件,例如导出 codepage 为 819 和 1386 的文件,如清单 1 所示。

清单 1. 导出 codepage 为 819 和 1386 的文件

 db2 "export to data819.del of del modified by codepage=819 
 select * from tab1" 
 
 db2 "export to data1386.del of del modified by codepage=1386 
 select * from tab1" 

注意 export 不能直接导出 asc 格式的文件。

2. 使用 UltraEdit 来编辑,先得到各种不同 codepage 数据的十六进制代码(可以从网上搜索或者 GVT 网站上查取),然后编辑保存就可以了。

例如: “你” 在 GBK(1386) 中是 X ’ C4E3 ’ , 在 UTF-8(1208)中是 X ’ E4BDA0 ’

图 1. 编辑‘你’的 GBK 代码
论 LOAD 与 IMPORT 中的 codepage 转换

3. 使用 Windows 操作系统下的 Microsoft Word 来制作数据,方式如下

设置 –〉控制面板—〉区域和语言选项,设置你需要的语言,然后可以使用 WORD 来另存为纯文本,选择其它编码来指定其编码。

4. 使用 vi 来设置 fileencoding 来达到目的

例如准备 codepage 为 1208 的数据:

 set fileencoding=utf-8 

图 2. 设定 fileencoding
论 LOAD 与 IMPORT 中的 codepage 转换

提示:准备数字和字母这些比较方便,但是准备中文,日文等就不是很方便了。建议使用 UltraEdit 来准备这些诸如中文,日文语言的 codepage。

LOAD 与 IMPORT 不同转换方式

缺省情况下,LOAD 认为输入文件是用数据库代码页编码的,直接将文件转化为数据库 codepage 编码。如果输入文件不是以数据库 codepage 编码的,可以通过 codepage 修饰符来导入正确文件。而缺省情况下 DB2 IMPORT 实用程序认为输入文件中的数据是用当前系统的代码页编码的。当将数据文件导入到数据库时,DB2 会自动将数据文件从当前系统代码页转换成数据库代码页。如果输入文件不是当前系统的代码页编码的。也可以通过 codepage 修饰符来轻松导入正确文件。

所以一般来说,LOAD 直接把源数据的 codepage 转化为数据库的 codepage,而 IMPORT 则先将源数据的 codepage 转换为应用程序的 codepage,然后将应用程序的 codepage 再转换为数据库的 codepage。

LOAD 实例分析

这些例子都是在 DB2 V97 中实现的,以下实例用的是同一个数据库 db1386, 两个数据文件 data1386.del,data1208.del。

data1386.del 和 data1208.del 包含同样的数据第一列为 1,第二列为你,第三列为繜。但是编码方式不同。data1386.del 以 codepage 1386 编码,而 data1208 以 codepage 1208 编码。

字符 GBK(1386) 代码点 UTF-8(1208) 代码点
X'C4E3' X'E4BDA0'
X'BF9F' X' E 7B99C'

Linux 上当前系统代码页可以通过 db2set db2codepage 来设置。另外需要 db2 terminate,使设置生效。

db codepage 是建 DB 时由 codeset,territory 决定的。例如:

 db2 create db db1386 using codeset GBK territory CN 

可以通过以下命令查看 db 的 codepage。

 db2 get db cfg for dbname |grep 'Database code page' 

数据 codepage 和 db codepage 一致时的 LOAD

缺省情况下 LOAD 认为数据 codepage 和 db codepage 一致,在这个例子中,导入成功。

清单 2. LOAD 清单 1

 db2 create db db1386 using codeset GBK territory CN 
 db2set db2codepage=1386 
 db2 terminate 
 db2 connect to db1386 
 db2 "create table t1(a int, b varchar(7),c varchar(10))" 
 db2 load from data1386.del of del replace into t1 
 db2 "select hex(b) as b ,hex(c) as c from t1" 

结果如图 3 所示。

图 3. 查询结果 1
论 LOAD 与 IMPORT 中的 codepage 转换

数据 codepage 和 db codepage 不一致时的 LOAD

这个例子属于不正确的 LOAD,没有做 codepage 转换,data1208.del 被当成 db codepage 编码存进了 db。

清单 3. LOAD 清单 2

 db2set db2codepage=1386 
 db2 terminate 
 db2 connect to db1386 
 db2 load from data1208.del of del replace into t1 
 db2 "select hex(b) as b ,hex(c) as c from t1" 

结果如图 4 所示。

图 4. 查询结果 2
论 LOAD 与 IMPORT 中的 codepage 转换

LOAD 时数据 codepage 不会转成应用程序的 codepage

data1208.del 不会转成应用程序的 codepage,而是直接当成 db codepage 编码存进 db。

清单 4. LOAD 清单 3

 db2set db2codepage=1208 
 db2 terminate 
 db2 connect to db1386 
 db2 load from data1208.del of del replace into t1  
 db2 "select hex(b) as b ,hex(c) as c from t1" 

结果如图 5 所示。

图 5. 查询结果 3
论 LOAD 与 IMPORT 中的 codepage 转换

数据 codepage 和 db codepage 不一致时正确的 LOAD

在这种情况下正确的 load,数据的 codepage 和 modified by codepage 一致,如清单 5 所示。

清单 5. LOAD 清单 4

 db2set db2codepage=1208 
 db2 terminate 
 db2 connect to db1386 
 db2 load from data1208.del of del modified by codepage=1208 
 replace into t1 
 
 db2 "select hex(b) as b ,hex(c) as c from t1" 

结果如图 6 所示。

图 6. 查询结果 4
论 LOAD 与 IMPORT 中的 codepage 转换

LMPORT 实例分析

以下例子所用数据同上面 load 实例数据。

数据 codepage 和应用程序 codepage, db codepage 一致时的 IMPORT

缺省情况下认为应用程序 codepage 就是数据的 codepage。

清单 6. IMPORT 清单 1

 db2set db2codepage=1386 
 db2 terminate 
 db2 connect to db1386 
 db2 import from data1386.del of del replace into t1 
 db2 "select hex(b) as b ,hex(c) as c from t1" 

结果如图 7 所示。

图 7. 查询结果 5
论 LOAD 与 IMPORT 中的 codepage 转换

数据 codepage 和应用程序 codepage 一致 , 但和 db codepage 不一致时的 IMPORT

缺省情况下认为应用程序 codepage 就是数据的 codepage,可以正确的导入。

清单 7. IMPORT 清单 2

 db2set db2codepage=1208 
 db2 terminate 
 db2 connect to db1386 
 db2 import from data1208.del of del replace into t1 
 db2 "select hex(b) as b ,hex(c) as c from t1" 

结果如图 8 所示。

图 8. 查询结果 6
论 LOAD 与 IMPORT 中的 codepage 转换

数据 codepage 和应用程序 codepage 不一致时利用 modified by codepage 成功实现 import 的 codepage 转换

清单 8. IMPORT 清单 3

 db2set db2codepage=1386 
 db2 terminate 
 db2 connect to db1386 
 db2 import from data1208.del of del modified by codepage=1208 
 replace into t1 
 
 db2 "select hex(b) as b ,hex(c) as c from t1" 

结果如图 9 所示。

图 9. 查询结果 7
论 LOAD 与 IMPORT 中的 codepage 转换

数据 codepage 和应用程序 codepage 不一致时不正确的 import,没有实现 codepage 转换

把 data1208.del 当成应用程序 codepage 1386 编码的,数据库 codepage 也是 1386,不进行 codepage 转换。

清单 9. IMPORT 清单 4

 db2set db2codepage=1386 
 db2 terminate 
 db2 connect to db1386 
 db2 import from data1208.del of del replace into t1 
 db2 "select hex(b) as b ,hex(c) as c from t1" 

结果如图 10 所示。

图 10. 查询结果 8    
论 LOAD 与 IMPORT 中的 codepage 转换

结束语

本文介绍了 LOAD,IMPORT 在不同情况下的 codepage 转换,以便使用户更好的理解 codepage 转换。

Tags:LOAD IMPORT codepage

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接