1 ClickHouse的数据类型
分为基础类型、复合类型和特殊类型
【基础类型】
- ClickHouse则直接使用Int8、Int16、Int32和Int64指代4种大小的Int类型
- ClickHouse的浮点数支持正无穷、负无穷以及非数字的表达方式
- 如果要求更高精度的数值运算,则需要使用定点数。ClickHouse提供了Decimal32、Decimal64和Decimal128三种精度的定点数
- 字符串由String定义,长度不限。因此在使用String的时候无须声明大小
- FixedString表示固定长度的字符串,FixedString使用null字节填充末尾字符
- ClickHouse有UUID数据类型
- 时间类型分为DateTime、DateTime64和Date三类。ClickHouse目前没有时间戳类型
【复合类型】
ClickHouse还提供了数组、元组、枚举和嵌套四类复合类型
- 不需要主动声明数组的元素类型。因为ClickHouse的数组拥有类型推断的能力,推断依据:以最小存储代价为原则,即使用最小可表达的数据类型
- 同一个数组内可以包含多种数据类型,例如数组[1,2.0]是可行的。但各类型之间必须兼容
- 元组类型由1~n个元素组成,每个元素之间允许设置不同的数据类型,且彼此之间不要求兼容
- ClickHouse支持枚举类型,这是一种在定义常量时经常会使用的数据类型
- 枚举固定使用(String:Int)Key/Value键值对的形式定义数据;key和Value是不允许重复的,要保证唯一性。Key和Value的值都不能为Null,但Key允许是空字符串。在写入枚举数据的时候,只会用到Key字符串部分
- 虽然枚举定义中的Key属于String类型,但是在后续对枚举的所有操作中(包括排序、分组、去重、过滤等),会使用Int类型的Value值
- 嵌套类型本质是一种多维数组的结构。嵌套表中的每个字段都是一个数组,并且行与行之间数组的长度无须对
【特殊类型】
- Nullable 表示可以写入null
- Nullable只能和基础类型搭配使用,不能用于数组和元组这些复合类型,也不能作为索引字段;其次,应该慎用Nullable类型,包括Nullable的数据表,不然会使查询和写入性能变慢。因为在正常情况下,每个列字段的数据会被存储在对应的[Column].bin文件中。如果一个列字段被Nullable类型修饰后,会额外生成一个[Column].null.bin文件专门保存它的Null值。这意味着在读取和写入数据时,需要一倍的额外文件操作。
2 参考
朱凯《ClickHouse原理解析与应用实践》