NUMBER 数据类型
NUMBER 数据类型支持使用 Oracle NUMBER 数据类型的应用程序。
启用
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 的效果如下所示。
- 如果指定 NUMBER 时未指定精度和小数位属性,那么它将映射到 DECFLOAT(16)。
- 如果指定 NUMBER(p),那么它将映射到 DECIMAL(p)。
- 如果指定 NUMBER(p,s),那么它将映射到 DECIMAL(p,s)。
数字文字支持未更改:整数、十进制和浮点常量的规则仍适用。这些规则将十进制文字限制为 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) 的值,而不是整数数据类型。用整数除以零的运算将返回无穷大和警告,而不是返回错误。
- COALESCE
- DECODE
- GREATEST
- LEAST
- MAX(标量)
- MIN(标量)
- NVL
- VALUE
- 集合运算中的相应列:UNION、EXCEPT(MINUS) 和 INTERSECT
- IN 谓词的 IN 列表中的表达式值
- 多行 VALUES 子句的相应表达式
源数据类型 | 目标数据类型 | |||
---|---|---|---|---|
整数类型 | 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 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。
限制
- 不支持以下各项:
- 精度属性大于 31
- 带星号的精度属性 (*)
- 超过精度属性的小数位属性
- 负小数位属性
- 无法使用数据类型为没有精度的 NUMBER (DECFLOAT) 的自变量调用三角函数或 DIGITS 标量函数。
- 无法创建名为 NUMBER 的单值类型。