提升数据类型

数据类型可以分为多个由相关数据类型组成的组。 在此类组中,存在优先顺序(即认为一种数据类型应排在另一种数据类型之前)。 此优先级允许将一种数据类型提升为优先顺序中后面的数据类型。

例如,数据类型 CHAR 可以提升为 VARCHAR;INTEGER 可以提升为 DOUBLE-PRECISION;但 CLOB 不能提升为 VARCHAR。

在以下情况下会使用数据类型提升:
  • 执行函数解析
  • 强制转换用户定义的类型
  • 将用户定义的类型分配给内置数据类型
表 1 显示每种数据类型的优先顺序列表 (按顺序) ,可用于确定可以将给定数据类型提升到的数据类型。 该表显示,最佳选择始终使用相同的数据类型,而不是选择提升为另一种数据类型。
表 1. 数据类型优先级表
数据类型 数据类型优先级列表(按从最好到最坏的顺序)
SMALLINT SMALLINT、INTEGER、BIGINT、decimal、real、double 或 DECFLOAT
整数 INTEGER、BIGINT、decimal、real、double 或 DECFLOAT
BIGINT BIGINT、decimal、real、double 或 DECFLOAT
decimal decimal、real、double 或 DECFLOAT
real real、double 或 DECFLOAT
double double 或 DECFLOAT
DECFLOAT DECFLOAT
CHAR CHAR、VARCHAR 或 CLOB
VARCHAR VARCHAR 或 CLOB
CLOB CLOB
GRAPHIC GRAPHIC、VARGRAPHIC 或 DBCLOB
VARGRAPHIC VARGRAPHIC 或 DBCLOB
DBCLOB DBCLOB
BINARY BINARY、VARBINARY 或 BLOB
VARBINARY VARBINARY 或 BLOB
BLOB BLOB
日期 DATE 或 TIMESTAMP
时间 时间
TIMESTAMP TIMESTAMP
BOOLEAN 布尔值
CURSOR CURSOR
ARRAY ARRAY
udt udt(同名)或 udt 的超类型
REF(T) REF(S)(前提是 S 是 T 的超类型)
ROW ROW
注:
  1. 上表中的小写类型定义如下:
    • decimal = DECIMAL(p,s) 或 NUMERIC(p,s)
    • real = REAL 或 FLOAT(n),其中 n 不大于 24
    • double = DOUBLE、DOUBLE-PRECISION、FLOAT 或 FLOAT(n),其中 n 大于 24
    • udt = 用户定义的类型(弱类型的单值类型除外,它使用源类型来确定数据类型优先级)

    所列数据类型的短格式和长格式同义词将被认为与所列格式相同

  2. 对于 Unicode 数据库,以下数据类型将被认为是等效的:
    • CHAR 和 GRAPHIC
    • VARCHAR 和 VARGRAPHIC
    • CLOB 和 DBCLOB

    在 Unicode 数据库中解析函数时,如果用户定义的函数和内置函数都适用于给定函数调用,那么通常会调用内置函数。 仅当 UDF 的模式在 CURRENT PATH 专用寄存器中位于 SYSIBM 之前并且其参数数据类型与所有函数调用参数数据类型匹配(不管 Unicode 数据类型等效性如何)时,才会调用该 UDF。