ClickHouse 数据类型

ClickHouse提供了许多数据类型,它们可以划分为基础类型、复合类型和特殊类型。我们可以在system.data_type_families表中检查数据类型名称以及是否区分大小写。这个表中存储了ClickHouse支持的所有数据类型。
下面介绍下常用的数据类型,ClickHouse与Mysql、Hive中常用数据类型的对比图如下:
在这里插入图片描述

1.Int

ClickHouse中整形分为Int8、Int16、Int32、Int64来表示整数不同的取值范围,其末尾数字正好代表占用字节的大小(8位=1字节),整形又包含有符号整形和无符号整形,他们写法上的区别为无符号整形前面加“U”表示。

  • 有符号整型范围
    在这里插入图片描述
  • 无符号整形范围:
    在这里插入图片描述

2.Float

我们建议使用整数方式来存储数据,因为浮点类型数据计算可能导致四舍五入的误差。浮点类型包含单精度浮点数和双精度浮点数。

  • 单精度浮点数
    在这里插入图片描述
    Float32从小数点后第8位起会发生数据溢出。
  • 双精度浮点数
    在这里插入图片描述
    Float64从小数点后第17位起会发生数据溢出。
  • 示例
    toFloat32(…) 用来将字符串转换成Float32类型的函数
    toFloat64(…) 用来将字符串转换成Float64类型的函数

3.Decimal

有符号的定点数,可在加、减和乘法运算过程中保持精度。ClickHouse提供了Decimal32、Decimal64、Decimal128、Decimal256几种精度的定点数,支持几种写法:

  • Decimal(P,S)
  • Decimal32(S),数据范围:(-1*10(9-S),1*10(9-S))
  • Decimal64(S),数据范围:(-1*10(18-S),1*10(18-S))
  • Decimal128(S),数据范围:(-1*10(38-S),1*10(38-S))
  • Decimal256(S),数据范围:(-1*10(76-S),1*10(76-S))

其中,P代表精度,决定总位数(整数部分+小数部分),取值范围是1~76。S代表规模,决定小数位数,取值范围是0-P。

4.String

字符串可以是任意长度的。它可以包含任意的字节集,包含空字节。因此,字符串类型可以代替其他 DBMSs 中的VARCHAR、BLOB、CLOB 等类型。

5.FixedString

固定长度N的字符串(N必须是严格的正自然数),一般在明确字符串长度的场景下使用,可以使用下面的语法对列声明为FixedString类型:
N表示字符串的长度。
<column_name> FixedString(N)
当向ClickHouse中插入数据时,如果字符串包含的字节数少于 N ,将对字符串末尾进行空字节填充。如果字符串包含的字节数大于N,将抛出Too large value for FixedString(N)异常。
当做数据查询时,ClickHouse不会删除字符串末尾的空字节。 如果使用WHERE子句,则须要手动添加空字节以匹配FixedString的值,新版本后期不需要手动添加。

  • toFixedString(value,N):将字符串转换为N位长度,N不能小于value字符串实际长度。

6.UUID

UUID是一种数据库常见的主键类型,在ClickHouse中直接把它作为一种数据类型。UUID共有32位,它的格式为8-4-4-4-12,如果在插入新记录时未指定UUID列值,则UUID值将用0来填充(00000000-0000-0000-0000-000000000000)。
UUID类型不支持算术运算、聚合函数sum和avg。

  • generateUUIDv4()随机生成一个32位的UUID。

7.Date

Date只能精确到天,用两个字节存储,表示从1970-01-01(无符号)到当前的日期值。日期中没有存储时区信息,不能指定时区。

  • now() : 获取当前天日期,返回格式:yyyy-MM-dd HH:mm:ss
  • toDate(value) : 将字符串转成Date,只支持yyyy-MM-dd格式。

8.DateTime

DateTime精确到秒,可以指定时区。用四个字节(无符号的)存储Unix时间戳。允许存储与日期类型相同的范围内的值。最小值为0000-00-00 00:00:00,时间戳类型值精确到秒。
时区使用启动客户端或服务器时的系统时区。默认情况下,客户端连接到服务的时候会使用服务端时区。您可以通过启用客户端命令行选项 --use_client_time_zone 来设置使用客户端时区。

  • toDateTime(DateTimeValue) :将字符串转成DateTime,只支持yyyy-MM-dd HH:MI:SS。
  • toDateTime(DateTimeValue,时区) :同上,支持将数据转换为对应时区时间。

9.DateTime64

DateTime64精确到毫秒和微秒,可以指定时区。在内部,此类型以Int64类型将数据存储。时间刻度的分辨率由precision参数确定。此外,DateTime64 类型可以像存储其他数据列一样存储时区信息,时区会影响 DateTime64 类型的值如何以文本格式显示,以及如何解析以字符串形式指定的时间数据 (‘2020-01-01 05:00:01.000’)。时区信息不存储在表的行中,而是存储在列的元数据中。
语法如下:
precision 精度,timezone:时区
DateTime64(precision, [timezone])

  • toDateTime64(timeStr,precision):将字符串转成DateTime64,精度为precision。支持yyyy-MM-dd HH:MI:SS.SSS时间格式。
  • toDateTime64(timeStr,precision,timezone):同上,只是可以将时间转换为对应时区时间。

10.布尔类型

ClickHouse中没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1。具体参照枚举类型。

11.枚举类型 Enum

枚举类型通常在定义常量时使用,ClickHouse提供了Enum8和Enum16两种枚举类型。Enum保存’string’=integer的对应关系。在 ClickHouse 中,尽管用户使用的是字符串常量,但所有含有 Enum 数据类型的操作都是按照包含整数的值来执行。这在性能方面比使用 String 数据类型更有效。
Enum8和Enum16分别对应’String’=Int8和’String’=Int16,Enum8类型的每个值范围是-128 … 127,Enum16类型的每个值范围是-32768 … 32767,所有的字符串或者数字都必须是不一样的,允许存在空字符串,Enum类型中数字可以是任意顺序,顺序并不重要。
向Enum字段中插入值时,可以插入枚举的字符串值也可以插入枚举对应的Int值,建议插入对应的字符串值,这样避免插入对应的Int值不在Enum枚举集合中再次查询表时报错。定义了枚举类型值之后,不能写入其他值的数据,写入的值不在枚举集合中就会抛出异常。

12.Nullable

Nullable类型只能与基础数据类型搭配使用,表示某个类型的值可以为NULL,Nullable(Int8)表示可以存储Int8类型的值,没有值时存NULL。使用Nullable需要注意:Nullable类型的字段不能作为索引字段,尽量避免使用Nullable类型,因为字段被定义为Nullable类型后会额外生成[Column].null.bin文件保存Null值,增加开销,比普通列消耗更多的存储空间。

13.数组类型 Array(T)

Array(T),由 T 类型元素组成的数组。T 可以是任意类型,包含数组类型。但不推荐使用多维数组,ClickHouse对多维数组的支持有限。例如,不能在MergeTree表中存储多维数组。
数组的定义方式有两种:Array(T),[1,2,3… …],数组类型里面的元素必须具有相同的数据类型,否则会报异常。另外,需要注意的是,数组元素中如果存在Null值,则元素类型将变为Nullable。
从数组中查询获取值使用 xx[1|2… …],直接使用中括号获取值,下标从1开始。

14.Tuple类型

元组类型有1~n个元素组成,每个元素允许设置不同的数据类型,且彼此之间不要求兼容。与数组类似,元组也可以使用两种方式定义:tuple(1,‘hello’,12.34)或者直接写(1,‘hello’,45.67),元组中可以存储多种数据类型,但是要注意数据类型的顺序。

15.嵌套类型Nested

ClickHouse支持嵌套数据类型(Nested),可以为一个表定义一个或者多个嵌套数据类型字段,但是每个嵌套字段只支持一级嵌套,即嵌套字段内不能继续使用嵌套类型。嵌套一般用来表示简单的级联关系,嵌套本质上是一个多维数组,嵌套类型中的每个数组的长度必须相同。目前,Nested类型支持很局限,MergeTree引擎中不支持Nested类型。
在这里插入图片描述

16.Domain

Domain类型是特定实现的类型,目前支持IPv4和IPv6两类,本质上他们是对整形和字符串的进一步封装,IPv4类型基于UInt32封装,IPv6基于FixedString(16)封装。
出于便捷性的考量,例如:IPv4类型支持格式检查,格式错误的IP无法被写入。出于性能的考量,IPv4和IPv6相对于String更加紧凑,占用的空间更小,查询性能更快。
在使用Domain时需要注意,虽然表面看起来与String一样,但是Domain类型并不是字符串,也不支持隐式自动转换成字符串,如果需要返回IP的字符串形式,需要调用函数IPv4NumToString()和IPv6NumToString()显式实现。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

留不住的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值