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'。
第四列中的数据是 INGEST 实用程序在其可以覆盖应用程序代码页时发送至 DB2 的内容。 第四列中的数据是 INGEST 实用程序在其无法覆盖应用程序代码页时发送的内容。 请注意,当字段定义和列定义的 FOR BIT DATA 属性不同时,结果可能不同,如上表所示。表 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 将执行代码页转换。 如果 DB2 不支持下列任何情况下的代码页转换,那么 INGEST 实用程序会发出错误并且命令结束。
下列情况下需要转换 在这种情况下,从以下代码页转换 到 ... 转换执行者 INGEST 命令包含需要转换到输入数据代码页的字符串或 SQL 标识。 应用程序代码页 输入数据代码页 INGEST 实用程序 实用程序可以将应用程序代码页面覆盖为输入数据代码页。 输入代码页 数据库代码页 Db2 实用程序无法覆盖应用程序代码页。 输入代码页 应用程序代码页 INGEST 实用程序 实用程序无法覆盖应用程序代码页。 应用程序代码页 数据库代码页 Db2