为了支持那些使用 Oracle NUMBER 数据类型的应用程序,引入了 NUMBER 数据类型。
对 NUMBER 的支持是在数据库级别提供的,因此,在创建需要此支持的数据库之前,必须先启用此支持。要完成此任务,请将 DB2_COMPATIBILITY_VECTOR 注册表变量设置为适当的值。在启用了 NUMBER 的情况下创建数据库时,数据库配置参数 number_compat 将设置为 ON。在启用 NUMBER 支持的情况下创建数据库之后,无法对该数据库禁用该支持,即使重置 DB2_COMPATIBILITY_VECTOR 注册表变量亦如此。同样,对于所有在未启用 NUMBER 支持的情况下创建的数据库而言,无法启用 NUMBER 支持,即使设置 DB2_COMPATIBILITY_VECTOR 注册表变量亦如此。
要启用 NUMBER 数据类型支持,请在创建数据库之前设置 DB2_COMPATIBILITY_VECTOR 注册表变量的第 5 位(0x10)。要充分利用这些 DB2® 兼容性功能,请将值设置为 ORA。这是建议的设置。注册表变量的新设置直到实例停止并重新启动后才会生效。
对于将 number_compat 数据库配置参数设置为 ON 的 DB2 数据库,启用了以下支持。
支持的最大精度是 31,并且,小数位数必须是不大于精度的正数值。此隐式映射的结果是,消息将引用数据类型 DECFLOAT 和 DECIMAL 而不是 NUMBER,并且,任何描述列数据类型或例程数据类型的操作都将返回 DECIMAL 或 DECFLOAT 而不是 NUMBER。注意,DECFLOAT(16) 提供的最大精度低于 Oracle NUMBER 数据类型。如果在表中存储数字需要 16 位以上的精度,那么应该将具有此需求的列明确定义为 DECFLOAT(34)。
在 number_compat 配置参数设置为 ON 的 DB2 数据库中,未更改数字文字支持。整数、十进制和浮点常量的规则仍适用。这将十进制文字限制为 31 位,并将浮点文字限制为二进制双精度浮点值的范围。对于超出 DECIMAL 或 DOUBLE 的范围并在 DECFLOAT(34) 范围内的值,可以执行从字符串到 DECFLOAT(34) 的强制转换(通过指定 CAST 或使用 DECFLOAT 函数)。
通过指定 CAST 或者使用 VARCHAR 或 CHAR 标量函数将 NUMBER 数据值强制转换为字符串时,将从结果中除去所有前导零。
目前,不支持以 D 或 F 结尾的数字文字(它们分别表示 64 位二进制浮点值和 32 位二进制浮点值)。包含 E 的数字文字的数据类型为 DOUBLE,您可以通过指定 CAST 或使用强制类型转换函数 REAL 将其强制转换为 REAL。
在 number_compat 配置参数设置为 ON 的 DB2 数据库中,用于 CREATE SEQUENCE 语句中的序列值的缺省数据类型是 DECIMAL(27) 而不是 INTEGER。
在 number_compat 配置参数设置为 ON 的 DB2 数据库中,所有涉及 DECIMAL 或 DECFLOAT 数据类型的算术运算以及算术或数学函数实际都使用十进制浮点算术进行运算并返回数据类型为 DECFLOAT(34) 的值。这也适用于两个操作数都是 DECIMAL 或 DECFLOAT(16) 数据类型的算术运算,这与《DB2 SQL 参考》中有关十进制算术的描述有所不同。(请参阅『表达式』中的『带有算术运算符的表达式』。)另外,所有只涉及整数数据类型(SMALLINT、INTEGER 或 BIGINT)的除法运算实际上都使用十进制浮点算术进行并返回数据类型为 DECFLOAT(34) 而不是整数数据类型的值(使用整数操作数的除零运算将返回无穷大和一个警告,而不是返回错误)。
函数解析也有所更改,数据类型为 DECIMAL 的自变量在解析过程中将被视为 DECFLOAT 值。为了进行函数解析,这实际上是将自变量与 NUMBER(p[,s]) 数据类型相对应的函数看成自变量数据类型为 NUMBER。
| 源数据类型 | 目标数据类型 | |||
|---|---|---|---|---|
| 整数类型 | DECIMAL | DECFLOAT | REAL/DOUBLE | |
| 整数类型 | 不适用 | 不适用 | decflt_rounding | round_half_even |
| DECIMAL | decflt_rounding | decflt_rounding | decflt_rounding | round_half_even |
| DECFLOAT | decflt_rounding | decflt_rounding | decflt_rounding | round_half_even |
| REAL/DOUBLE | 截断 | decflt_rounding | decflt_rounding | round_half_even |
| 字符串(仅适用于强制类型转换) | 不适用 | decflt_rounding | decflt_rounding | round_half_even |
DB2 十进制浮点值基于 IEEE 754R 标准。在检索 DECFLOAT 数据以及将 DECFLOAT 数据强制类型转换为字符串时,将除去小数点后的任何尾部零。