Databend 作为一款开源、弹性、低成本,基于对象存储也可以做实时分析的新式数仓,有必要清楚支持的数据类型有哪些,通过学习收集,常见类型如下:
数据大类 | 数据类型 | 别名 | 字节大小 | 类型描述 |
---|---|---|---|---|
整数类型 | tinyint | int8 | 1 byte | 范围从-128至127 |
整数类型 | smallint | int16 | 2 bytes | 范围从-32768至32767 |
整数类型 | int | int32 | 2 bytes | 范围从-2147483648至2147483647 |
整数类型 | bigint | int64 | 2 bytes | 范围从-9223372036854775808至9223372036854775807 |
浮点数类型 | float | - | 4 byte | 单精度浮点数 |
浮点数类型 | double | - | 8 byte | 双精度浮点数 |
浮点数类型 | decimal | - | 可变 | 用于精确十进制数值的定点类型,可以指定精度和小数点位置 |
字符串类型 | varchar | string | 可变 | 存储可变长度的字符串 |
日期时间类型 | date | - | 4 byte | 存储范围从’1000-01-01’至’9999-12-31’的日期,格式为’YYYY-MM-DD’ |
日期时间类型 | timestamp | - | 8 byte | 存储日期时间,格式为’YYYY-MM-DD HH:SS.ffffff’ |
布尔类型 | boolean | bool | 1 byte | 用于存储布尔类型0或1 |
其他数据类型 | array | - | 可变 | 如[1, 2, 3, 4],相同数据类型的值的集合,通过其索引访问 |
其他数据类型 | tuple | - | 可变 | 如(‘2023-02-14’,‘Valentine’),不同数据类型的值的有序集合,通过其索引访问 |
其他数据类型 | map | - | 可变 | 如{“a”:1, “b”:2, “c”:3},一组键值对,其中每个键都是唯一的,并映射到一个值 |
其他数据类型 | variant | json | 可变 | 如[1,{“a”:1,“b”:{“c”:2}}],收集不同数据类型的元素,包括array和object |
其他数据类型 | bitmap | - | 可变 | 如0101010101,一种二进制数据类型,表示一组值,其中每个位表示值的存在或缺失 |
通过以上表格,可以看到和 Mysql 数据类型还是存在一些差异,不过不影响,有此表格希望对你建表过程中有参考依据。
为什么要数据类型转换,不知在使用 Databend 过程中是否遇到过以下问题。
select 39 > '301';-- 报错
select concat(39,'a');-- unable to unify `UInt8` with `String`
发生报错的原因都是因为类型没有统一,可能在 Mysql 没有统一也能进行比较而不会报错,
但是对于 Databend 是不允许的!!!
在使用其他数据库时,由于数据类型不一致也能计算,导致我们也会忽略它带来的影响,如:
select 39 > 301;-- 0
select '39' > '301';-- 1
字符串比较是根据每一位字符对应的的ASCII值大小进行比较,由于’9’字符比’0’大,导致
select '39' > '301';
得出的结果为真
。
可见,当没有对数据设置正确的类型时,进行比较大小将返回错误的结果,那如果又是将比较用在了排名排序上,得出的结果也是有问题的。因此,特别需要对数据类型转换,常见的转换函数如下:
函数语法 | 函数描述 | 数据样例 |
---|---|---|
cast(expr as data_type) | 将数据转换另一种类型 | cast(1 as varchar),输出’1’ |
expr::data_type | 将数据转换另一种类型,cast 的别名 | 1::varchar,输出’1’ |
try_cast(expr as data_type) | 将数据转换另一种类型,错误时返回NULL | 1::varchar,输出’1’ |
有了数据类型列表,但是在实际应用过程中还是会有些扩展或疑惑。
对于整数类型,可能会遇到“无符号整数”,我们可以进一步使用unsigned
,示例如下:
create table test_numeric
(
tiny tinyint,
tiny_unsigned tinyint unsigned,
small smallint,
small_unsigned smallint unsigned,
i int,
i_unsigned int unsigned,
bigi bigint,
bigi_unsigned bigint unsigned
);
布尔类型,常见的就是 true 和 false,但也存在隐式转换。
数值类型和字符串类型转换:
所有其他
非'TRUE'和'FALSE'文本字符串
无法转换为布尔值,它将获得Code: 1010
错误。
十进制类型对于需要精确的十进制表示的应用程序非常有用,例如财务计算或科学计算。
使用decimal(p, s)来指示十进制类型。
如果您有decimal(10, 2),您可以存储最多 10 digits 值,小数点右侧为 2 digits。最小值为-9999999.99,最大值为9999999.99。
此外,decimal 有一套复杂的精确推理规则。不同的规则将适用于不同的表达式,以推断精度。
算术运算
比较操作
聚合操作
varchar 在 Mysql 中是可变字符串,通常会给定变长数值,但是在 Databend 上不需要给定,如下:
create table string_table(text varchar);
在 Databend 中只有两种类型 date 和 timestamp ,而且 timestamp 格式为’YYYY-MM-DD HH:SS.ffffff’,这与 Mysql 有些不同,需要注意。如要了解更多,可查看 Databend 日期时间类型。
array
数据类型可以定义可变的,这种数据类型类似于 Python 列表,但 Python 中的列表索引是从0开始的,而 Databend 是从1开始。
create table array_int64_table(arr array(int64));
select array_value[0],array_value[4],array_value[6]
from (select [1, 2, 3, 4] as array_value) as t1;
+----------------+----------------+----------------+
| array_value[0] | array_value[4] | array_value[6]
+----------------+----------------+----------------+
| NULL | 4 | NULL
+----------------+----------------+----------------+
Databend对数组使用基于1的编号约定。由n个元素组成的数组以
数组[1]
开始,以数组[n]结束。
tuple
元组是有序、不可变和异构元素的集合,在大多数编程语言中用括号()
表示。换句话说,元组是不同数据类型元素的有限有序列表,一旦创建,其元素就无法更改或修改,这点和 Python 元组 类似。示例如下:
create table t_table(event tuple(timestamp, varchar));
insert into t_table values(('2023-02-14 08:00:00','valentines day'));
select event,event[1]
from t_table;
+------------------------------------------+---------------------+
| event |. event[1] |
+------------------------------------------+---------------------+
| ('2023-02-14 08:00:00','valentines day') | 2023-02-14 08:00:00 |
+------------------------------------------+---------------------+
tuple
与 array
有点不同是如果索引不在范围内,则直接报错。
map
数据结构用于保存一组Key:Value键值对,类似于 Python 字典。
Key具有指定的基本数据类型,包括布尔值、数字、十进制、字符串、日期或时间戳。Key的值不能为空,也不允许重复。Value可以是任何数据类型,包括嵌套数组、元组等。
select map_value1,map_value2, map_value1['k1']
from (select {'k1': 1, 'k2': 2} map_value1, map([1, 2], ['v1', 'v2']) as map_value2) as t1;
+-----------------+-----------------+----------------+
| map_value1 | map_value2 | map_value1['k1']
+-----------------+-----------------+----------------+
| {'k1':1,'k2':2} | {1:'v1',2:'v2'} | 1
+-----------------+-----------------+----------------+
通过本文对 Databend 数据类型介绍可知,合理正确使用数据类型至关重要,所以在设计表结构过程中,一定要多次甄别,如果数据类型设计或用错,可及时参照本文进行更正!!
参考资料: