INGEST 实用程序的代码页注意事项

当 INGEST 实用程序处理输入数据时,将涉及三个代码页:应用程序(客户机)代码页、输入数据代码页和数据库代码页。

代码页 指定方式 缺省值
应用程序(客户机)代码页,在 CLP 命令文件中使用 通过当前语言环境确定 通过当前语言环境确定
输入数据代码页 INGEST 命令上的 INPUT CODEPAGE 应用程序代码页
数据库代码页 CREATE DATABASE 命令上指定 1208(Unicode 的 UTF-8 编码)

如果输入数据代码页与应用程序代码页不同,那么 INGEST 实用程序将使用输入数据代码页临时覆盖应用程序代码页,以便 Db2® 将数据直接从输入数据代码页转换为数据库代码页。 在某些条件下,INGEST 实用程序无法覆盖应用程序代码页。 在此情况下,INGEST 实用程序会先将未定义为 FOR BIT DATA 的字符数据转换为应用程序代码页,然后再传递给 DB2。 在所有情况下,如果未将列定义为 FOR BIT DATA,那么 DB2 会将数据转换为数据库代码页。

CLP 命令文件代码页
INGEST 实用程序假定 INGEST 命令的文本采用应用程序代码页,十六进制常量除外。 每当 INGEST 实用程序需要比较 INGEST 命令中指定的字符串(例如,将 DEFAULTIF 字符与输入数据中的字符进行比较)时,INGEST 实用程序会执行任何必要的代码页转换,以确保所比较的字符串在相同的代码页中。 INGEST 实用程序和 DB2 都不会对十六进制常量执行任何转换。
输入数据代码页
如果字段和它所在的表列都定义为 FOR BIT DATA,那么 INGEST 实用程序和 DB2 都不会执行任何代码页转换。 例如,假定 INGEST 命令将字段 $c1 指定给列 C1,并且该字段和该列都定义为 CHAR FOR BIT DATA。 如果输入字段包含 X'E9',那么无论输入数据代码页或数据库代码页是什么,DB2 都会将列 C1 设置为 X'E9'。

强烈建议如果列定义省略 FOR BIT DATA,那么其相应的字段定义也省略 FOR BIT DATA。 同样地,如果列定义指定 FOR BIT DATA,那么其相应的字段也应指定 FOR BIT DATA。 否则,指定给列的值是不可预测的,因为该值取决于 INGEST 实用程序是否可以覆盖应用程序代码页。

下列示例阐明了这种情况:
  • 输入数据代码页为 819。
  • 应用程序代码页为 850。
  • 数据库代码页为 1208 (UTF-8)。
  • 输入数据为“é”(带有重音符的“e”),该字符在代码页 819 中为 X'E9',在代码页 850 中为 X'82',在 UTF-8 中为 X'C3A9'。
下表显示了数据在服务器上的结果,它取决字段及/或列是否定义为 FOR BIT DATA 以及 INGEST 实用程序是否可以覆盖应用程序代码页:
表 1. 当字段和列定义都定义为 FOR BIT DATA 时的可能结果
字段定义 列定义 输入数据(代码页 819) 数据在 INGEST 实用程序将其转换到应用程序代码页 850 之后的结果 当 INGEST 实用程序可以覆盖应用程序代码页时数据在服务器上的结果 当 INGEST 实用程序无法覆盖应用程序代码页时数据在服务器上的结果
CHAR CHAR X'E9' X'82' X'C3A9' X'C3A9'
CHAR FOR BIT DATA CHAR FOR BIT DATA X'E9' X'E9' X'E9' X'E9'
CHAR FOR BIT DATA CHAR X'E9' X'E9' X'C3A9' X 'C39A' ("")
CHAR CHAR FOR BIT DATA X'E9' X'82' X'E9' X'82'
第四列中的数据是 INGEST 实用程序在其可以覆盖应用程序代码页时发送至 DB2 的内容。 第四列中的数据是 INGEST 实用程序在其无法覆盖应用程序代码页时发送的内容。 请注意,当字段定义和列定义的 FOR BIT DATA 属性不同时,结果可能不同,如上表所示。
代码页错误
如果输入代码页、应用程序代码或数据库代码页不相同,那么 INGEST 实用程序和/或 DB2 将执行代码页转换。 如果 DB2 不支持下列任何情况下的代码页转换,那么 INGEST 实用程序会发出错误并且命令结束。
下列情况下需要转换 在这种情况下,从以下代码页转换 到 ... 转换执行者
INGEST 命令包含需要转换到输入数据代码页的字符串或 SQL 标识。 应用程序代码页 输入数据代码页 INGEST 实用程序
实用程序可以将应用程序代码页面覆盖为输入数据代码页。 输入代码页 数据库代码页 Db2
实用程序无法覆盖应用程序代码页。 输入代码页 应用程序代码页 INGEST 实用程序
实用程序无法覆盖应用程序代码页。 应用程序代码页 数据库代码页 Db2