【Databend】数据类型

数据类型列表

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,但也存在隐式转换。

数值类型和字符串类型转换:

  • 0 转换为 false。
  • 任何非 0 数值都转换为 true。
  • 字符串为’true’会被转化为:true
  • 字符串为’false’会被转化为:false
  • 而且转换不区分大小写。

所有其他非'TRUE'和'FALSE'文本字符串无法转换为布尔值,它将获得Code: 1010错误。

浮点数类型

十进制类型对于需要精确的十进制表示的应用程序非常有用,例如财务计算或科学计算。
使用decimal(p, s)来指示十进制类型。

  • p是精度,即数字中的总位数,其范围为[1,76]。
  • s是刻度,即小数点右侧的位数,它的范围是[0,p]。

如果您有decimal(10, 2),您可以存储最多 10 digits 值,小数点右侧为 2 digits。最小值为-9999999.99,最大值为9999999.99。

此外,decimal 有一套复杂的精确推理规则。不同的规则将适用于不同的表达式,以推断精度。

算术运算

  • 加法/减法:decimal(a, b) + decimal(x, y) -> decimal(max(a - b, x - y) + max(b, y) + 1, max(b, y))这意味着整数和十进制部分都使用两个操作数的较大值。
  • 乘法:decimal(a, b) * d(x, y) -> decimal(a + x, b + y)
  • 分部:decimal(a, b) / decimal(x, y) -> decimal(a + y, b)

比较操作

  • 十进制可以与其他数字类型进行比较。
  • 十进制可以与其他十进制类型进行比较。

聚合操作

  • sum:sum(decimal(a, b)) -> decimal(max, b)
  • avg:arg(decimal(a, b)) -> decimal(max, max(b, 4))

字符串类型

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 |
+------------------------------------------+---------------------+

tuplearray 有点不同是如果索引不在范围内,则直接报错。

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 数据类型介绍可知,合理正确使用数据类型至关重要,所以在设计表结构过程中,一定要多次甄别,如果数据类型设计或用错,可及时参照本文进行更正!!
参考资料:

猜你喜欢

转载自blog.csdn.net/weixin_50357986/article/details/135425694