数据类型
Introduced or updated: v1.2.100
本页介绍了数据类型的各个方面,包括数据类型列表、数据类型转换、转换方法以及 NULL 值和 NOT NULL 约束的处理。
数据类型列表
以下是 Databend 中的常规数据类型列表:
数据类型 | 别名 | 存储大小 | 最小值 | 最大值 |
---|---|---|---|---|
BOOLEAN | BOOL | 1 字节 | N/A | N/A |
TINYINT | INT8 | 1 字节 | -128 | 127 |
SMALLINT | INT16 | 2 字节 | -32768 | 32767 |
INT | INT32 | 4 字节 | -2147483648 | 2147483647 |
BIGINT | INT64 | 8 字节 | -9223372036854775808 | 9223372036854775807 |
FLOAT | N/A | 4 字节 | -3.40282347e+38 | 3.40282347e+38 |
DOUBLE | N/A | 8 字节 | -1.7976931348623157E+308 | 1.7976931348623157E+308 |
DECIMAL | N/A | 16/32 字节 | -10^P / 10^S | 10^P / 10^S |
DATE | N/A | 4 字节 | 1000-01-01 | 9999-12-31 |
TIMESTAMP | N/A | 8 字节 | 0001-01-01 00:00:00 | 9999-12-31 23:59:59.999999 UTC |
VARCHAR | STRING | N/A | N/A | N/A |
以下是 Databend 中的半结构化数据类型列表:
数据类型 | 别名 | 示例 | 描述 |
---|---|---|---|
ARRAY | N/A | [1, 2, 3, 4] | 相同数据类型的值的集合,通过索引访问。 |
TUPLE | N/A | ('2023-02-14','Valentine Day') | 不同数据类型的值的有序集合,通过索引访问。 |
MAP | N/A | {"a":1, "b":2, "c":3} | 一组键值对,其中每个键都是唯一的并映射到一个值。 |
VARIANT | JSON | [1,{"a":1,"b":{"c":2}}] | 不同数据类型元素的集合,包括 ARRAY 和 OBJECT 。 |
BITMAP | N/A | 0101010101 | 一种二进制数据类型,用于表示一组值,其中每个位表示值的存在或缺失。 |
数据类型转换
显式转换
我们有两种表达式可以将一个值转换为另一种数据类型。
CAST
函数,如果在转换过程中发生错误,它会抛出错误。
我们还支持 pg 转换样式:CAST(c as INT)
与 c::Int
相同
TRY_CAST
函数,如果在转换过程中发生错误,它会返回 NULL。
隐式转换 ("Coercion")
关于 "Coercion" (也称为自动转换)的一些基本规则
- 所有整数数据类型都可以隐式转换为
BIGINT
(也称为INT64
)数据类型。
例如:
Int --> bigint
UInt8 --> bigint
Int32 --> bigint
- 所有数字数据类型都可以隐式转换为
Double
(也称为Float64
)数据类型。
例如:
Int --> Double
Float --> Double
Int32 --> Double
- 所有非空数据类型
T
都可以隐式转换为Nullable(T)
数据类型。
例如:
Int --> Nullable<Int>
String --> Nullable<String>
- 所有数据类型都可以隐式转换为
Variant
数据类型。
例如:
Int --> Variant
- String 数据类型是最低的数据类型,不能隐式转换为其他数据类型。
- 如果
T
-->U
,则Array<T>
-->Array<U>
。 - 如果
T
-->U
,则Nullable<T>
-->Nullable<U>
。 - 对于任何
T
数据类型,Null
-->Nullable<T>
。 - 如果没有精度损失,则数值可以隐式转换为其他数值数据类型。
常见问题解答
为什么数值类型不能自动转换为 String 类型。
这很简单,甚至在其他流行的数据库中也可以工作。但是这会引入歧义。
例如:
select 39 > '301';
select 39 = ' 39 ';
我们不知道如何使用数值规则或 String 规则来比较它们。因为根据不同的规则,它们会产生不同的结果。
select 39 > 301
为 false,而 select '39' > '301'
为 true。
为了使语法更精确且更少歧义,我们会向用户抛出错误并获得更精确的 SQL。
为什么布尔类型不能自动转换为数值类型。
这也会带来歧义。 例如:
select true > 0.5;
什么是错误消息:“can't cast from nullable data into non-nullable type”。
这意味着您的源列中有一个 null 值。您可以使用 TRY_CAST
函数或使您的目标类型成为可空类型。
select concat(1, col)
不起作用
您可以将 SQL 改进为 select concat('1', col)
。
我们将来可能会改进表达式,如果可能的话,可以将文字 1
解析为 String 值(concat 函数只接受 String 参数)。