DB2 10.5 for Linux, UNIX, and Windows

NUMBER 数据类型

NUMBER 数据类型支持使用 Oracle NUMBER 数据类型的应用程序。

启用

在创建需要 NUMBER 支持的数据库之前,在数据库级别启用该支持。要启用该支持,请将 DB2_COMPATIBILITY_VECTOR 注册表变量设置为十六进制值 0x10(位位置 5),然后停止并重新启动该实例以使新设置生效。
db2set DB2_COMPATIBILITY_VECTOR=10
   db2stop
   db2start
要充分利用 Oracle 应用程序的 DB2 兼容性功能部件,DB2_COMPATIBILITY_VECTOR 的推荐设置是 ORA,这将设置所有兼容性位。

创建启用了 NUMBER 支持的数据库之后,将 number_compat 数据库配置参数设置为 ON

如果创建启用了 NUMBER 支持的数据库,那么无法禁用该数据库的 NUMBER 支持,即使重置 DB2_COMPATIBILITY_VECTOR 注册表变量也是如此。同样,如果创建启用了 NUMBER 支持的数据库,那么以后无法启用该数据库的 NUMBER 支持,即使通过设置 DB2_COMPATIBILITY_VECTOR 注册表变量也是如此。

作用

number_compat 数据库配置参数设置为 ON 的效果如下所示。

当在 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)。

数字文字支持未更改:整数、十进制和浮点常量的规则仍适用。这些规则将十进制文字限制为 31 位,并将浮点文字限制为二进制双精度浮点值的范围。如果有必要,对于超出 DECIMAL 或 DOUBLE 的范围并在 DECFLOAT(34) 范围内的值,可以使用字符串到 DECFLOAT(34) 的强制类型转换(使用 CAST 规范或 DECFLOAT 函数)。目前,既不支持以 D 结尾的数字文字(它表示 64 位二进制浮点值),也不支持以 F 结尾的数字文字(它表示 32 位二进制浮点值)。包含 E 的数字文字的数据类型为 DOUBLE,您可以使用 CAST 规范或使用强制类型转换函数 REAL 将其强制转换为 REAL

如果通过使用 CAST 规范或者使用 VARCHAR 或 CHAR 标量函数将 NUMBER 数据值强制转换为字符串,那么将从结果中除去所有前导零。

用于 CREATE SEQUENCE 语句中的序列值的缺省数据类型是 DECIMAL(27) 而不是 INTEGER。

所有涉及 DECIMAL 或 DECFLOAT 数据类型的算术运算以及算术或数学函数实际都使用十进制浮点算术进行运算,并返回数据类型为 DECFLOAT(34) 的值。此类型的性能还适用于两个操作数都是 DECIMAL 或 DECFLOAT(16) 数据类型的算术运算,这与《表达式中有关十进制算术的描述有所不同。 另外,所有只涉及整数数据类型(SMALLINT、INTEGER 或 BIGINT)的除法运算实际上都使用十进制浮点算术执行。这些操作返回数据类型为 DECFLOAT(34) 的值,而不是整数数据类型。用整数除以零的运算将返回无穷大和警告,而不是返回错误。

在某些情况下,函数解析也有所更改,例如,数据类型为 DECIMAL 的自变量在解析过程中将被视为 DECFLOAT 值。另外,这实际上是将自变量与 NUMBER(p[,s]) 数据类型相对应的函数看成自变量数据类型为 NUMBER。但是,函数解析方面的此更改并不适用于那些自变量数目可变并且结果数据类型基于自变量数据类型集的函数集。此集合中包括的函数如下所示:
  • COALESCE
  • DECODE
  • GREATEST
  • LEAST
  • MAX(标量)
  • MIN(标量)
  • NVL
  • VALUE
除了对数字函数所作的一般更改以外,MOD 函数还具有特殊注意事项;如果 MOD 函数中的第二个自变量为 0,那么该函数将返回第一个自变量的值。
结果数据类型的规则扩展为:如果 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 数据强制类型转换为字符串时,将除去小数点后的任何尾部零。

从 DB2 V10.5 FP4 开始,在启用了 NUMBER 支持的数据库中,具有整数输入的内置函数 STDDEV、VAR 和 VARIANCE 返回 DECFLOAT 而不是 DOUBLE。所具有的结果类型依赖于此函数的任何视图列或具体化查询表 (MQT) 列将继续返回旧结果类型,直到重新生成或重新创建视图或 MQT。针对 MQT,先前路由到 MQT 的任何查询将不再执行此操作,直到重新创建此 MQT。

客户机/服务器兼容性

如果已对 DB2 数据库服务器启用 NUMBER 数据类型支持,那么与该服务器配合使用的客户机应用程序将永远不会从该服务器接收到 NUMBER 数据类型。在 DB2 数据库服务器上,任何要从 Oracle 服务器上报告 NUMBER 的列或表达式都会报告 DECIMAL 或 DECFLOAT。

由于 Oracle 环境期望舍入方式为 round-half-up,因此客户机舍入方式与服务器舍入方式匹配至关重要。这意味着,db2cli.ini 文件设置必须与 decflt_rounding 数据库配置参数的值匹配。要最接近匹配 Oracle 舍入方式,应该为数据库配置参数指定 ROUND_HALF_UP

限制

NUMBER 数据类型支持具有下列限制:
  • 不支持以下各项:
    • 精度属性大于 31
    • 带星号的精度属性 (*)
    • 超过精度属性的小数位属性
    • 负小数位属性
    没有用于 NUMBER 类数据类型规范的相应 DECIMAL 精度和小数位数支持。
  • 无法使用数据类型为没有精度的 NUMBER (DECFLOAT) 的自变量调用三角函数或 DIGITS 标量函数。
  • 无法创建名为 NUMBER 的单值类型。