级别: 初级 Sherman Lau, DB2 UDB Globalization, IBM 多伦多实验室
2002 年 10 月 01 日 DB2 UDB 命令行处理器(CLP)为执行 DB2 命令、SQL 命令和 DB2 实用程序提供了界面。本文说明了在 Windows 和 AIX 上,如何使用您所选择的本地语言来使用 CLP。另外,对于 IMPORT、EXPORT 和 LOAD,本文还讲述了本地语言代码页。
简介
DB2® Universal Database(UDB)在全世界得到了广泛的使用,它能够处理多种本地语言。如果您正在非英语环境下使用 DB2 UDB,则您必须确保设置正确。如果没有设置所需环境,则与 DB2 相互操作时,您可能看不到自己首选的本地语言。此外,如果没有考虑到代码页问题,则在使用某些实用程序时,数据库中的字符可能会出现乱码。本文描述了如何用某种具体的本地语言与 DB2 UDB 进行相互操作,以及代码页如何影响数据库中的数据。
DB2 UDB 命令行处理器
DB2 命令行处理器(CLP)是一个命令行界面,用来执行数据库实用程序、SQL
语句和联机帮助。除了保留的 DB2 命令和关键字(这些总是使用英语)以外,CLP 使用操作系统命令提示符所采用的本地语言与您交互。
DB2 V8 支持以下本地语言:
| 英语 | | 法语 | | 德语 | | 意大利语 | | 西班牙语 | | 巴西葡萄牙语 | | 日语 | | 韩国语 | | 简体中文 | | 繁体中文 | | 丹麦语 | | 芬兰语 | | 挪威语 | | 瑞典语 | | 俄语 | | 波兰语 | | 阿拉伯语 | | 克罗地亚语 | | 捷克语 | | 荷兰语 | | 希伯来语 | | 匈牙利语 | | 欧洲大陆葡萄牙语 | | 罗马尼亚语 | | 斯洛伐克语 | | 土耳其语 | | 保加利亚语 | | 斯洛文尼亚语 |
如果 DB2 支持某种语言,则您可以选择使用这种语言与 DB2 交互。否则,CLP 将用英语显示。让我们来看一下在 DB2 的命令行处理器下,怎样使用某种特定的本地语言。
UNIX
在 UNIX® 平台上,如果 DB2 支持环境变量 LANG 所指定的某种语言,并且也已安装了该语言,则 CLP 用这种语言与您交互。否则使用英语。例如,如果将 AIX® 上的 LANG 设为“Ja_JP”,则 CLP 将从
sqllib/msg/Ja_JP
目录检索 Shift JIS 日语消息。如果看到乱码,则系统上可能没有正确安装该字体或语言环境。关于安装字体和语言环境的信息,请参阅
在英文 OS 上的 DB2 UDB V8 中设置混合字节字符集(MBCS)数据库一文。
要检查当前的 LANG 设置,请输入
locale 。可以通过输入
db2
调用 CLP。下面这个示例向您显示了如何发出
locale 命令、启动 CLP,然后在日语环境下如何输入一些命令等。
Windows 和 OS/2
在 Windows® 和 OS/2® 上,安装 DB2 V7 时,只能安装一种本地语言版本的 DB2。CLP
将使用这种语言。然而,对于 DB2 UDB V8,支持在 Windows 下安装多种本地语言。(注:DB2 UDB V8 不支持
OS/2)。不论 DB2 的本地语言版本是什么,CLP 都将使用 Windows 所使用的语言。
DB2 UDB Administration Guide - Planning手册中的
National Language Support Appendix包含一些有关 DB2 本地语言支持功能方面的重要附加信息。
DB2 UDB EXPORT、IMPORT 和 LOAD 实用程序
DB2 EXPORT 实用程序使用户可以将 DB2 数据库中的数据写到存储在数据库之外的一个或多个文件中。DB2 UDB
IMPORT 和 LOAD 实用程序使用户可以将文件中的数据插入到数据库表或可更新的视图中。
下面几节将讨论 DB2 UDB EXPORT、IMPORT 和 LOAD 实用程序中与代码页相关的问题。关于这些实用程序更详细的信息,请参阅
DB2 UDB Data Movement Utilities Guide and Reference。
DB2 使您能在任何受支持的系统内用某种受支持的代码集来创建数据库。例如,尽管 Linux
可能不支持 IBM-932 或 IBM-943 代码集,但在 Linux 机器上可以创建 IBM-932、IBM-943、IBM-EUCJP/EUCJP 或 UTF-8 数据库。按官方说法,Linux 不支持 IBM-932 或
IBM-943,但由于 Linux 是开放源码,所以 Linux 用户可以添加这种支持。
可以用不同代码页中的各种代码点来表示同一个字符。例如,下表列出了用各种可用代码集中的代码点来表示相同两个日语字符“
”:
|
代码集
|
代码点
| | IBM-932 | X'93FA 8E9E' | | IBM-943 | X'93FA 8E9E' | | IBM-EUCJP/EUCJP | X'C6FC BBFE' | | Unicode UTF-8 | X'E697A5 E69982' | | Unicode UCS-2(大尾数法) | X'65E5 6642' |
使用 IMPORT 时代码页注意事项
缺省情况下,DB2 IMPORT 实用程序认为输入文件中的数据是用当前系统的代码页编码的。例如,在
AIX 上,如果将环境变量 LANG 设置为“Ja_JP.IBM943”,则 IMPORT 将认为输入数据文件是用代码页 943 编码的。当将数据文件导入到数据库时,DB2 会自动将数据文件从当前系统代码页转换成数据库代码页。
IMPORT 实用程序 CODEPAGE 修饰符提供了一种附加功能。CODEPAGE 修饰符(V7 修订包 4 中引入此功能)会强制 DB2 首先将数据文件从修饰符的值转换成当前系统代码页,然后再从当前系统代码页转换成数据库代码页。注:如果数据文件包含当前系统代码页中不存在的字符,则在导入或装入到数据库时,会丢失该字符。在代码页转换过程中,当数据扩展时可能会发生截断现象。
例如,假设在 Linux 上正使用代码页 954(EUC-JP),有一个用代码页 954 编码的数据文件
data.954 。文件
data.954 包含两个用 X'C6FCBBFE'
表示的字符“
”。您希望将
data.954 文件中的数据插入到 Unicode 数据库中。
可以输入以下命令来找到数据库代码页:
db2 get database configuration for <databaseName>
|
现在,对于 Unicode 数据库,DB2 用 UTF-8 来编码 CHAR、VARCHAR、LONG VARCHAR 和 CLOB
列,并用 UCS-2 大尾数法格式来编码 GRAPHIC、VARGRAPHIC、LONG VARGRAPHIC 和 DBCLOB 列。当在不指定 CODEPAGE
修饰符的情形下导入
data.954 文件时,这两个字符“
”将被转换成
Unicode 字符列中的 X'E697A5 E69982' 或 Unicode 图形列中的 X'65E5 6642'。字符“
”将从 EUC-JP 下的 4 字节扩展为 UTF-8 下的 6 字节。如果 Unicode 字符列被定义为 varchar(4),则导入失败。在代码页转换过程中可能会发生扩展(或收缩)。在该示例中,列的大小必须等于或大于 varchar(6) 以适合这两个字符“
”。
然而,您也可能希望导入一些来自其它操作系统的数据,这些数据是用不同的代码页来编码的。例如,可能从一台运行日语代码页
939 的 zSeries 机器上将
data.939 文件复制到 Shift JIS 943 AIX 机器上。假定
data.939
文件包含两个日语字符:“
”。您在 AIX 机器上可能会看到“EbFQ”,而不是“
”。原因是您的 AIX 环境认为这些字符是用 943 编码的,而不是用 939 编码的。然而,如果用十六进制查看该文件,则会看到用代码点 X'4562 4651'
表示的这两个字符。
在 AIX 上,如果在将 LANG 设为“Ja_JP.IBM943”的情形下,只是简单地将
data.939 文件直接 IMPORT 到数据库,则插入的数据会出现乱码。解决这种问题有两种方法:
- 首先使用第三方工具,将数据文件从代码页 939 转换成代码页 943,然后将转换后的文件
IMPORT 到数据库中。
在 UNIX 平台上,可以使用系统实用程序
iconv 将数据文件从一种代码页转换成另一种代码页。例如,命令
iconv -f IBM-939 -t IBM-943 data.939 > data.943
|
将
data.939 文件从代码页 939 转换成代码页 943,并将输出重定向到
data.943 文件。
注:
iconv支持不同 UNIX 平台上的各种代码集。在 AIX 上,所有
iconv
所支持的代码页转换表都位于
/usr/lib/nls/loc/iconv/* ,而在 Solaris 上,是在
/usr/lib/iconv/* 。
如果将
data.943 文件导入到日语或 Unicode 数据库,则字符不会出现乱码。例如,
db2 import from data.943 of asc method L (1 4) insert into
tableName
|
将把“
”这两个字符在没有任何丢失的情况下插入到数据库中。
-
使用 DB2 IMPORT 实用程序的 CODEPAGE 修饰符。例如:
您会发现 CODEPAGE 修饰符方法通常要比第三方的转换工具方法好,因为 DB2 用一步就可以转换数据。CODEPAGE
修饰符方法不依赖于任何第三方工具的可用性。
使用 LOAD 时代码页注意事项
缺省情况下,DB2 LOAD 实用程序认为输入文件中的数据是用数据库代码页编码的。
然而,您也可能希望装入一些不是用数据库代码页编码的数据。例如,您可能有一个 Unicode 数据库,而
data.943 数据文件是用系统代码页 IBM-943,Shift-JIS 日语编码的。如果仅将
data.943 文件直接 LOAD 到 Unicode
数据库,则插入的数据会出现乱码。Unicode 数据库中字符串是用 UTF-8 编码的,代码页为 1208。解决这种问题有两种方法:
- 首先使用第三方工具,将数据文件从代码页 943 转换成代码页 1208,然后将转换后的文件
LOAD 到数据库中。在 UNIX 平台,可以使用系统实用程序
iconv将数据文件从一种代码页转换成另一种代码页。
例如,命令
iconv -f IBM-943 -t UTF-8 data.943 > data.1208
|
将把
data.943 文件从代码页 943 转换成代码页 1208 ,并将输出重定向到
data.1208 。如果将
data.1208 文件装入到 Unicode 数据库,则字符不会出现乱码。
- 使用 DB2 UDB LOAD 实用程序的 CODEPAGE 修饰符
>> "db2 load from data.943 of asc modified by codepage=943
method L (1 4) insert into tableName"
|
在用 IMPORT 实用程序时,CODEPAGE 修饰符方法要比用第三方工具的方法更有效,因为 DB2 用一步就可以转换转换数据,而不需要第三方工具。
使用 EXPORT 时代码页注意事项
缺省情况下,DB2 EXPORT 实用程序使用当前系统代码页将数据写入到输出文件中。例如,如果
AIX LANG 环境变量为“ja_JP”,则用 EXPORT 导出的输出文件用代码页 954 进行编码。
当将数据从数据库导出到文件时,DB2 会自动将数据从数据库代码页转换成当前系统代码页。如果
EXPORT 命令中有 CODEPAGE 修饰符,则 DB2 将数据从数据库代码页转换成当前系统代码页,然后再从当前系统代码页转换成
CODEPAGE 修饰符所指定的代码页。
例如,假定在 Unicode 数据库的某个字符列中包含两个字符“
”。这些字符用 UTF-8 存储为 X'E697A5 E69982'。当在运行代码页 954 的 Linux 机器上导出该列时,输出文件将包含以 X'C6FC BBFE' 表示的用代码页 954 编码的两个字符。
然而,您也可能希望为运行其它代码页的另一操作系统准备一个数据文件。例如,可能希望从
AIX 上的 EUC-JP 数据库导出数据,并将该文件导入到 Windows 下的电子表格程序中。数据库中有一列包含两个日语字符“
”。当使用通常的导出命令进行导出操作时,输出文件将用代码页 954 进行编码,这两个字符“
”用代码点 X'C6FC BBFE' 表示。
>> "db2 export to data.954 of del select * from tableName"
|
缺省情况下,日语 Windows 的 ANSI 代码页是 943 而不是 954,仅将
data.954
文件导入到日语 Windows 系统下的电子表格程序将会出现乱码。
同样,解决这种问题有两种方法:
- 在将文件导入到电子表格程序之前,首先使用第三方应用程序将数据文件从代码页 954 转换成代码页 943。
- 使用 DB2 EXPORT 实用程序的 CODEPAGE 文件类型修饰符。以下是一个使用 EXPORT 的 CODEPAGE 修饰符的示例:
结束语
在使用各种本地语言和各种操作系统方面,DB2 UDB 具有很大的灵活性。即使操作系统不支持某种代码页,对于数据本身,DB2 也可能支持这种代码页。在设置正确的情况下,可以使用您所选择的语言与
DB2 进行相互操作,避免数据出现乱码。
关于作者
对本文的评价
|