跳到主要内容

类型转换

在 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\TobooltinyintsmallintintbigintlargeintfloatdoubledecimaldatedatetimetimeIPv4IPv6charvarcharstringbitmaphlljsonarraymapstructvariant
boolPPPPPPPPPxxxxxxxPxxx
tinyintPPPPPPPPPPPPxxxxPxxx
smallintPPPPPPPPPPPPxxxxPxxx
intPPPPPPPPPPPPxxxxPxxx
bigintPPPPPPPPPPPPxxxxPxxx
largeintPPPPPPPPPPPPxxxxPxxx
floatPPPPPPPPPPPPxxxxPxxx
doublePPPPPPPPPPPPxxxxPxxx
decimalPPPPPPPPPPPPxxxxPxxx
datexxxPPPxxxPPxxxxxxxxx
datetimexxxxPPxxxPPPxxxxxxxx
timexPPPPPxxxPPPxxxxxxxx
IPv4xxxxxxxxxxxxPPxxxxxx
IPv6xxxxxxxxxxxxxPxxxxxx
charPPPPPPPPPPPPPPxxPPPP
varcharPPPPPPPPPPPPPPxxPPPP
stringPPPPPPPPPPPPPPxxPPPP
bitmapxxxxxxxxxxxxxxxxxPxxxxx
hllxxxxxxxxxxxxxxxxxxPxxxx
jsonAAAAAAAAAxxxxxAAAxxPAxA
arrayxxxxxxxxxxxxxxxxPPxx
mapxxxxxxxxxxxxxxxxxxPx
structxxxxxxxxxxxxxxxxPxxP
variant

非严格模式

From\TobooltinyintsmallintintbigintlargeintfloatdoubledecimaldatedatetimetimeIPv4IPv6charvarcharstringbitmaphlljsonarraymapstructvariant
boolPPPPPPPPOxxxxxxxPxxx
tinyintPPPPPPPPOAAAxxxxPxxx
smallintPAPPPPPPOAAAxxxxPxxx
intPAAPPPPPOAAAxxxxPxxx
bigintPAAAPPPPOAAAxxxxPxxx
largeintPAAAAPPPOAAAxxxxPxxx
floatPAAAAAPPAAAAxxxxPxxx
doublePAAAAAPPAAAAxxxxPxxx
decimalPOOOOOPPOAAAxxxxPxxx
datexxxPPPPPxPPxxxxxxxxx
datetimexxxxPPPPxPAPxxxxxxxx
timexAAAPPPPxPPAxxxxxxxx
IPv4xxxxxxxxxxxxPPxxxxxx
IPv6xxxxxxxxxxxxxPxxxxxx
charAAAAAAAAAAAAAAxxAAAA
varcharAAAAAAAAAAAAAAxxAAAA
stringAAAAAAAAAAAAAAxxAAAA
bitmapxxxxxxxxxxxxxxxxxPxxxxx
hllxxxxxxxxxxxxxxxxxxPxxxx
jsonAAAAAAAAAxxxxxAAAxxPAxA
arrayxxxxxxxxxxxxxxxxPPxx
mapxxxxxxxxxxxxxxxxxxPx
structxxxxxxxxxxxxxxxxPxxP
variant

隐式转换

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

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

等场景。

转换矩阵

TODO

公共类型

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

TODO