DB2 V9.7 for Linux, UNIX, and Windows

NUMBER 数据类型

为了支持那些使用 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 数据库,启用了以下支持。

当 SQL 语句明确遇到了 NUMBER 数据类型时,将按以下方式对此数据类型进行映射:
  • 如果指定 NUMBER 时未指定精度和小数位属性,那么它将映射到 DECFLOAT(16)。
  • 如果指定 NUMBER(p),那么它将映射到 DECIMAL(p)。
  • 如果指定 NUMBER(p,s),那么它将映射到 DECIMAL(p,s)。

支持的最大精度是 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。

函数解析方面的此更改并不适用于那些自变量数目可变并且结果数据类型基于自变量数据类型集的函数集。此集合中包括的函数包括:
  • COALESCE
  • DECODE
  • GREATEST
  • LEAST
  • MAX(标量)
  • MIN(标量)
  • NVL
  • VALUE
number_compat 配置参数设置为 ON 时,有关结果数据类型的规则将扩展为:如果 DECIMAL 结果数据类型的精度将超出 31,那么使 DECFLOAT(34) 成为结果数据类型。这些规则还适用于 UNION、EXCEPT(MINUS)和 INTERSECT 等集合运算中的相应列、IN 谓词的 IN 列表中的表达式值以及多行 VALUES 子句的相应表达式。
数据库服务器上发生的赋值和强制类型转换所使用的舍入方式取决于所涉及的数据类型。在某些情况下,将进行截断。在目标是二进制浮点(REAL 或 DOUBLE)值的情况下,将按惯例使用 round-half-even。在其他情况下(通常涉及 DECIMAL 或 DECFLOAT 值),舍入基于 decflt_rounding 数据库配置参数的值进行。此参数缺省值为 round-half-even,但可以设置为 round-half-up 以便与 Oracle 舍入方式匹配。下表摘要说明用于各种数字赋值和强制类型转换的舍入运算。
表 1. 用于数字赋值和强制类型转换的舍入运算
源数据类型 目标数据类型
整数类型 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 数据强制类型转换为字符串时,将除去小数点后的任何尾部零。

客户机/服务器兼容性注意事项

限制

NUMBER 数据类型支持具有下列限制:
  • 不支持精度属性大于 31、精度属性为星号(*)、小数位数属性超出精度属性或者小数位数属性为负数的 NUMBER 数据类型。没有用于此类数据类型规范的相应 DECIMAL 精度和小数位数支持。
  • 调用三角函数和 DIGITS 标量函数时,不能指定数据类型为没有精度的 NUMBER(DECFLOAT)的自变量。
  • 不能创建名为 NUMBER 的单值类型。