【Databend】数据类型

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【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 数据类型介绍可知,合理正确使用数据类型至关重要,所以在设计表结构过程中,一定要多次甄别,如果数据类型设计或用错,可及时参照本文进行更正!!

参考资料:

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
存储 关系型数据库 MySQL
TiDB中的数据类型详解
【2月更文挑战第29天】TiDB支持多种数据类型:整数(TINYINT到BIGINT)、浮点(FLOAT, DOUBLE)、定点(DECIMAL)、字符串(CHAR, VARCHAR, TEXT)、日期时间(DATE, TIME, DATETIME, TIMESTAMP)、二进制(BINARY, VARBINARY, BLOB)以及枚举和集合(ENUM, SET)。正确选择数据类型对存储、查询和性能至关重要。
1115 1
|
存储 分布式计算 大数据
MaxCompute数据类型映射
MaxCompute数据类型映射
|
7月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之如何将Hologres字段转换为小写
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4月前
|
存储 NoSQL 索引
MPP架构数据仓库使用问题之在ORC文件中,String类型字段是怎么进行编码的
MPP架构数据仓库使用问题之在ORC文件中,String类型字段是怎么进行编码的
|
6月前
|
SQL JSON 关系型数据库
【Databend】基础函数应用
【Databend】基础函数应用
45 1
|
6月前
|
运维 Cloud Native 关系型数据库
云原生数据仓库AnalyticDB产品使用合集之布尔类型和int类型可以自动转换吗
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
160 1
|
6月前
|
SQL JSON 关系型数据库
【Databend】行列转化:一行变多行和简单分列
【Databend】行列转化:一行变多行和简单分列
51 1
|
7月前
|
存储 关系型数据库 MySQL
MySQL基础『数据类型』
MySQL基础『数据类型』
83 0
|
7月前
|
存储 SQL 前端开发
MYSQL基础知识之【数据类型】
MYSQL基础知识之【数据类型】
62 0
|
存储 SQL 分布式计算
数据仓库的Hive的数据类型的基本数据类型的字符串
在数据仓库领域,Hive是一个常用的工具。它是一个基于MapReduce的开源数据仓库,可以处理大规模的数据集。Hive中的数据类型是一个重要的话题,因为它们决定了数据如何被存储和处理。在本文中,我们将探讨Hive中的字符串数据类型。
177 2