跳到主要内容
最后 更新

类型转换

在 Doris 中,每个表达式均有其类型(例如 select 1, col1, from_unixtime(col2) from table1 中的 1col1from_unixtime(col2) 等)。将一个表达式从一种类型转换到另一种类型的过程称为“类型转换”。

类型转换会在两种情况下发生,一是显式转换,二是隐式转换。

所有类型转换均遵守特定的规则。我们根据转换的目标类型分类描述相关规则。例如,从 INT 转换到 DOUBLE 和 从 STRING 转换到 DOUBLE,均在 转换为 FLOAT/DOUBLE 文档中描述。

转换是否能发生,以及转换的结果是否为 Nullable 类型,与是否开启严格模式有关(session variable enable_strict_cast)。一般来说,当开启严格模式时,转换失败的数据将会立即引发报错导致 SQL 失败。当关闭严格模式时,转换失败的数据行结果为 NULL

显式转换

显式转换通过 CAST 函数进行,例如:

CAST(1.23 as INT) 将数字 1.23 转换为 INT 类型。

CAST(colA as DATETIME(6)) 将列/表达式 colA 转换为 DATETIME(6) 类型(即拥有微秒精度的 DATETIME 类型)。

以下分别描述在严格模式(enable_strict_cast = true)和非严格模式(enable_strict_cast = false)下,类型之间的转换关系。包括以下四种情况:

符号含义
x不允许转换
P当入参已经为 Nullable 类型时,返回类型才会为 Nullable,即该转换不会将非 Null 值转换为 Null
A返回类型总是为 Nullable 类型。即该转换有可能将非 Null 值转换为 Null
O当输入类型转换到输出类型可能溢出时,返回类型总是为 Nullable 类型。对于非 Null 值输入,如果转换实际导致溢出,该转换结果可能为 Null

具体的类型转换规则与 Nullable 属性,请查看当前目录下的各个类型转换文档。

严格模式

From\Tobooltinyintsmallintintbigintlargeintfloatdoubledecimaldatedatetimetimestamp_nstimeIPv4IPv6charvarcharstringbitmaphlljsonarraymapstructvariant
boolPPPPPPPPOxxxxxxxxPxxx
tinyintPPPPPPPPOAAAAxxxxPxxx
smallintPAPPPPPPOAAAAxxxxPxxx
intPAAPPPPPOAAAAxxxxPxxx
bigintPAAAPPPPOAAAAxxxxPxxx
largeintPAAAAPPPOAAAAxxxxPxxx
floatPAAAAAPPAAAAAxxxxPxxx
doublePAAAAAPPAAAAAxxxxPxxx
decimalPOOOOOPPOAAAAxxxxPxxx
datexxxPPPxxxPPAxxxxxxxxx
datetimexxxxPPxxxPAAPxxxxxxxx
timestamp_nsxxxxPPxxxPPPPxxPPPxxxxxxP
timexAAAPPxxxPPPAxxxxxxxx
IPv4xxxxxxxxxxxxxPPxxxxxx
IPv6xxxxxxxxxxxxxxPxxxxxx
charAAAAAAAAAAAAAAAxxAAAA
varcharAAAAAAAAAAAAAAAxxAAAA
stringAAAAAAAAAAAAAAAxxAAAA
bitmapxxxxxxxxxxxxxxxxxxPxxxxx
hllxxxxxxxxxxxxxxxxxxxPxxxx
jsonAAAAAAAAAxxxxxxAAAxxPAxA
arrayxxxxxxxxxxxxxxxxxPPxx
mapxxxxxxxxxxxxxxxxxxxPx
structxxxxxxxxxxxxxxxxxPxxP
variantA

非严格模式

From\Tobooltinyintsmallintintbigintlargeintfloatdoubledecimaldatedatetimetimestamp_nstimeIPv4IPv6charvarcharstringbitmaphlljsonarraymapstructvariant
boolPPPPPPPPOxxxxxxxxPxxx
tinyintPPPPPPPPOAAAAxxxxPxxx
smallintPAPPPPPPOAAAAxxxxPxxx
intPAAPPPPPOAAAAxxxxPxxx
bigintPAAAPPPPOAAAAxxxxPxxx
largeintPAAAAPPPOAAAAxxxxPxxx
floatPAAAAAPPAAAAAxxxxPxxx
doublePAAAAAPPAAAAAxxxxPxxx
decimalPOOOOOPPOAAAAxxxxPxxx
datexxxPPPPPxPPAxxxxxxxxx
datetimexxxxPPPPxPAAPxxxxxxxx
timestamp_nsxxxxPPPPxPPPPxxPPPxxxxxxP
timexAAAPPPPxPPPAxxxxxxxx
IPv4xxxxxxxxxxxxxPPxxxxxx
IPv6xxxxxxxxxxxxxxPxxxxxx
charAAAAAAAAAAAAAAAxxAAAA
varcharAAAAAAAAAAAAAAAxxAAAA
stringAAAAAAAAAAAAAAAxxAAAA
bitmapxxxxxxxxxxxxxxxxxxPxxxxx
hllxxxxxxxxxxxxxxxxxxxPxxxx
jsonAAAAAAAAAxxxxxxAAAxxPAxA
arrayxxxxxxxxxxxxxxxxxPPxx
mapxxxxxxxxxxxxxxxxxxxPx
structxxxxxxxxxxxxxxxxxPxxP
variantA

TIMESTAMP_NS 的详细转换规则请参见转换为 TIMESTAMP_NS。上面的矩阵暂未包含 TIMESTAMPTZTIMESTAMP_NSTIMESTAMPTZ 之间的双向转换在严格和非严格模式下均受支持。

隐式转换

隐式转换是在某种情况下,输入 SQL 中未指明,但 Doris 自动规划产生的 CAST 表达式。主要产生于:

  1. 函数调用时,给定实参类型与函数签名类型不匹配
  2. 数学表达式两侧类型不一致

等场景。

转换矩阵

TODO

公共类型

在因作为数学运算的操作数而需要发生隐式转换时,首先要确定转换的公共类型。两侧操作数如果与公共类型不一致,则会各自规划到公共类型的 CAST 表达式。