【Databend】数据类型

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 【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 数据类型介绍可知,合理正确使用数据类型至关重要,所以在设计表结构过程中,一定要多次甄别,如果数据类型设计或用错,可及时参照本文进行更正!!

参考资料:

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
Docker 容器
解决使用Dockerfile来build镜像时pip install遇到的BUG
解决使用Dockerfile来build镜像时pip install遇到的BUG
1471 5
解决使用Dockerfile来build镜像时pip install遇到的BUG
|
存储 SQL 数据可视化
【Databend】数据库和表操作
【Databend】数据库和表操作
327 1
|
机器学习/深度学习 人工智能 运维
人工智能在云计算中的运维优化:智能化的新时代
人工智能在云计算中的运维优化:智能化的新时代
1105 49
|
SQL 关系型数据库 MySQL
【Databand】日期时间函数
【Databand】日期时间函数
288 1
|
存储 搜索推荐 Java
使用Java构建高效的搜索引擎索引
使用Java构建高效的搜索引擎索引
|
存储 SQL JSON
Databend 的安装配置和使用
Databend 的安装配置和使用
561 1
|
机器学习/深度学习 数据采集 自然语言处理
【Conv】万金油一样的卷积层!使用卷积层替代全连接层与池化层
【Conv】万金油一样的卷积层!使用卷积层替代全连接层与池化层
977 1
|
消息中间件 Java Kafka
【消息中心】kafka消费失败重试10次的问题
【消息中心】kafka消费失败重试10次的问题
1999 0
|
消息中间件 Java Kafka
Spring 事务的独门绝技:钩子函数的使用技巧
经过前面对Spring AOP、事务的总结,我们已经对它们有了一个比较感性的认知了。今天,我继续安利一个独门绝技:Spring 事务的钩子函数。单纯的讲技术可能比较枯燥乏味。接下来,我将以一个实际的案例来描述Spring事务钩子函数的正确使用姿势。
Spring 事务的独门绝技:钩子函数的使用技巧
|
安全 网络安全
获取旁站 / C 段:第三方网站(附链接)
获取旁站 / C 段:第三方网站(附链接)