【Databend】数据类型

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

参考资料:

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
4月前
|
存储 缓存 数据挖掘
阿里云服务器租用价格,特价38元、99元、199元云服务器与最新活动价格参考
截止目前阿里云服务器价格最便宜主要有三款,轻量应用服务器2核2G峰值200M带宽38元1年;云服务器经济型e实例2核2G3M带宽99元1年;云服务器通用算力型u1实例2核4G5M带宽199元1年。除此之外,还有4核16G10M带宽只要89元/1个月、210元/3个月,8核32G10M带宽只要160元/1个月、480元/3个月。本文为大家分享目前阿里云的各个特价云服务器及活动价格情况,以供参考和选择。
825 17
|
8月前
|
Ubuntu 安全 Linux
Linux系统入门指南:从零开始学习Linux
Shell脚本是一种强大的自动化工具,可以帮助您简化重复的任务或创建复杂的脚本程序。了解Shell脚本的基本语法和常用命令,以及编写和运行Shell脚本的步骤,将使您更高效地处理日常任务。
693 0
|
SQL 关系型数据库 MySQL
【Databand】日期时间函数
【Databand】日期时间函数
342 1
|
机器学习/深度学习 人工智能 运维
人工智能在云计算中的运维优化:智能化的新时代
人工智能在云计算中的运维优化:智能化的新时代
1200 49
|
消息中间件 Java 中间件
MQ四兄弟:如何保证消息可靠性
本文介绍了RabbitMQ、RocketMQ、Kafka和Pulsar四种消息中间件的可靠性机制。这些中间件通过以下几种方式确保消息的可靠传输:1. 消息持久化,确保消息在重启后不会丢失;2. 确认机制,保证消息从生产者到消费者都被成功处理;3. 重试机制,处理失败后的重试;4. 死信队列,处理无法消费的消息。每种中间件的具体实现略有不同,但核心思想相似,都是从生产者、中间件本身和消费者三个角度来保障消息的可靠性。
763 0
|
SQL Oracle 关系型数据库
SQL如何添加字段记录:详细步骤与技巧
在数据库管理中,经常需要向已有的表中添加新的字段(列)或向表中插入新的记录
3571 5
|
存储 SQL 数据可视化
【Databend】数据库和表操作
【Databend】数据库和表操作
355 1
|
关系型数据库 MySQL 数据处理
Mysql关于同时使用Group by和Order by问题
总的来说,`GROUP BY`和 `ORDER BY`的合理使用和优化,可以在满足数据处理需求的同时,保证查询的性能。在实际应用中,应根据数据的特性和查询需求,合理设计索引和查询结构,以实现高效的数据处理。
1693 1
|
消息中间件 Java Kafka
Spring 事务的独门绝技:钩子函数的使用技巧
经过前面对Spring AOP、事务的总结,我们已经对它们有了一个比较感性的认知了。今天,我继续安利一个独门绝技:Spring 事务的钩子函数。单纯的讲技术可能比较枯燥乏味。接下来,我将以一个实际的案例来描述Spring事务钩子函数的正确使用姿势。
Spring 事务的独门绝技:钩子函数的使用技巧
|
安全 网络安全
获取旁站 / C 段:第三方网站(附链接)
获取旁站 / C 段:第三方网站(附链接)