专业的编程技术博客社区

网站首页 > 博客文章 正文

Clickhouse数据类型(clickhouse数据量)

baijin 2024-10-17 07:47:07 博客文章 11 ℃ 0 评论

数值类型

1)IntX和UIntX

以前我们常用Tinyint、Smallint、Int和Bigint指代整数的不同取值范围。而Clickhouse则直接使用Int8、Int16、Int32、Int64指代4种大小的int类型,其末尾的数字正好表明了占用字节的大小(8位=1字节)。

名称

大小(字节)

范围

普遍观念

Int8

1

-127到127

Tinyint

Int16

2

-32768到32767

Smallint

Int32

4

-2147483648到2147483647

Int

Int64

8

-9223372036854775808到9223372036854775807

Bigint

clickhouse支持无符号的整数,使用前缀U表示。

名称

大小(字节)

范围

普遍观念

UInt8

1

0到255

Tinyint Unsigned

UInt16

2

0到65535

Smallint Unsigned

UInt32

4

0到4294967295

Int Unsigned

UInt64

8

0到18446744073709551615

Bigint Unsigned

2)FloatX

名称

大小(字节)

有效精度

普遍概念

Float32

4

7

Float

Float64

8

16

Double

3)Decimal

如果要求更高精度的数值运算,则需要使用定点数。ClickHouse提供了Decimal32、Decimal64和Decimal128三种精度的定点数。可以通过两种形式声明定点:简写方式有Decimal32(S)、Decimal64(S)、Decimal128(S)三种,原生方式为Decimal(P,S),其中:

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

字符串类型

字符串类型可以细分为String、FixedString和UUID三类。从命名来看彷佛不像是由一款数据库提供的类型,反而更像是一门编程语言的设计,没错CK语法剧本编程语言的特征(数据+运算)。

1)String

字符串由String定义,长度不限。因此在使用String的时候无须声明大小。它完全替代了传统意义上数据库的varchar、text、Clob和Blob等字符类型。String类型不限定字符集,因为它根本没有这个概念,所以可以将任意编码的字符串存入其中。但是为了程序的规范性和可维护性,在同一套程序中应该遵循使用统一的编码,例如统一使用UTF-8编码就是一种很好的约定。所以在对数据操作的时候我们不再需要去关注编码和乱码问题。

2)FixedString

FixedString类型和传统意义上的Char类型有些类似,对于一些字符有明确长度的场合,可以使用固定长度的字符串。定长字符串通过FixedString(N)声明,其中N表示字符串长度。但与Char不同的是,FixedString使用null字节填充末尾字符,而Char通常使用空格填充。

3)UUID

UUID是一种数据库常见的主键类型,在ClickHouse中直接把它作为一种数据类型。UUID共有32位,它的格式位8-4-4-4-12。如果一个UUID类型的字段在写入时没有被赋值,则会依照格式使用0填充。

时间类型

1)Date

Date类型不包含具体的时间信息,只精准到天,支持字符串形式写入。

2)DateTime

DateTime类型包含时、分、秒信息,精准到秒,支持字符串形式写入。

3)DateTime64

DateTime64可以记录亚秒,它在DateTIme之上增加了精度的设置。亚秒默认是3位。

复杂类型

1)Enum

Clickhouse支持枚举类型,这是一种在定义常量时经常会使用的数据类型。Clickhouse提供了Enum8和Enum16两种枚举类型,它们除了取值范围不同之外,别无二致。枚举固定使用(String:int)key/value键值对的形式定义数据,所以Enum8和Enum16分别会对应(String:Int8)和(String:int16)。

在定义枚举集合的时候,有几点需要注意。首先,key和value是不允许重复的,要保证唯一性。其次,key和value的值都不能为null,但key允许是空字符串。在写入枚举数据的时候,只会用到key字符串部分。

注意:其实我们可以使用字符串来替代Enum类型来存储数据,那么为什么是要使用枚举类型呢?这是出于性能的考虑。因为虽然枚举定义中的key属于String类型,但是在后续对枚举的所有操作中(包括排序、分组、去重、过滤等),会使用int类型的value值,提高处理数据的效率。

2)Array(T)

CK支持数组这种复合数据类型,并且数据在操作在今后的数据分析中起到非常便利的效果。数组的定义方式有两种:array(T)[e1,e2...],我们在这里要求数组中的数据类型是一致的。

3)Tuple

元组类型由1~n个元素组成,每个元素之间允许设置不同的数据类型,且彼此之间不要求兼容。元组同样支持类型推断,其推断依据仍然以最小存储代价为原则。与数组类似,元组也可以使用两种方式定义,常规方式tuple(T):元组中可以存储多种数据类型,但是要注意数据类型的顺序。

4)Nested

nested是一种嵌套表结构。一张数据表,可以定义任意多个嵌套类型字段,但每个字段的嵌套层级只支持一级,即嵌套表内不能继续使用嵌套类型。对于简单场景的层级关系或关联关系,使用嵌套类型也是一种不错的选择。

嵌套类型本质是一种多维数组的结构。嵌套表中每个字段都是一个数组,并且行与行之间数组的长度无须对齐。需要注意的是,在同一行数据内每个数组长度必须相等。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表