ClickHouse的数据类型
ClickHouse⽀持的数据类型
ClickHouse与常⽤的关系型数据库MySQL或Oracle的数据类型类似,提供了丰富的数据类型⽀持。
1 整型
ClickHouse⽀持Int和Uint两种固定长度的整型,Int类型是符号整型,Uint类型是⽆符号整型。
整型:
数据类型取值范围
Int8-128 ~ 127
Int16-32768 ~ 32767
Int32-2147483648 ~ 2147483647
Int64-9223372036854775808 ~ 223372036854775807
⽆符号整型:
数据类型取值范围
UInt80 ~ 255
Uint160 ~ 65535
Uint320 ~ 4294967295
Uint640 ~ 18446744073709551615
2 浮点型
ClickHouse⽀持Float32和Float64两种浮点类型,浮点型在运算时可能会导致⼀些问题,例如计算的结果取决于计算机的处理器和操作系统、可能是正⽆穷或负⽆穷等问题,官⽅建议尽量以整数形式存储数据。例如,将固定精度的数字转换为整数值,例如货币数量或页⾯加载时间⽤毫秒为单位表⽰。
分类:Float32和Float64
-- 取值范围
select1-0.9--的结果是0.09999999999999998
select1/0--的结果是 inf(正⽆穷)
select-1/0--的结果是 -inf(负⽆穷)
select0/0--的结果是 nan(⾮数字)
3 Decimal
ClickHouse⽀持Decimal类型的有符号定点数,可在加、减和乘法运算过程中保持精度。对于除法,最低有效数字会被丢弃,但不会四舍五⼊。数据采⽤与⾃⾝位宽相同的有符号整数存储。这个数在内存中实际范围会⾼于上述范围,从 String 转换到⼗进制数的时候会做对应的检查。由于现代CPU不⽀持128位数字,因此 Decimal128 上的操作由软件模拟。
所以 Decimal128 的运算速度明显慢于 Decimal32/Decimal64。
Decimal(P,S),P参数指的是精度,有效范围:[1:38],决定可以有多少个⼗进制数字(包括分数);S参数指的是⼩数长度,有效范围:[0:P],决定数字的⼩数部分中包含的⼩数位数。
数据类型⼗进制的范围
Decimal32(S)Decimal32(S): ( -1 * 10^(9 - S), 1 * 10^(9 - S) )
Decimal64(S)Decimal64(S): ( -1 * 10^(18 - S), 1 * 10^(18 - S) )
Decimal128(S)Decimal128(S): ( -1 * 10^(38 - S), 1 * 10^(38 - S) )数据类型⼗进制的范围
对Decimal的⼆进制运算导致更宽的结果类型,两个不同的Decimal类型在运算时精度的变化规则如下:
例⼦
Decimal64(S1) Decimal32(S2) -> Decimal64(S) Decimal128(S1) Decimal32(S2) -> Decimal128(S)
⼩数变化规则加法,减法:S = max(S1, S2)乘法:S = S1 + S2
除法:S = S1
4 布尔型
ClickHouse中没有定义布尔类型,可以使⽤UInt8类型,取值限制为0或1。
5 字符串类型
ClickHouse中的String类型没有编码的概念。字符串可以是任意的字节集,按它们原本的⽅式进⾏存储和输出。若需存储⽂本,建议使⽤UTF-8编码。⾄少,如果你的终端使⽤UTF-8,这样读写就不需要进⾏任何的转换。对不同的编码⽂本ClickHouse会有不同处理字符串的函数。⽐如,length函数可以计算字符串包含的字节数组的长度,然⽽lengthUTF8函数是假设字符串以 UTF-8编码,计算的是字符串包含的Unicode字符的长度。
数据类型⼗进制的范围
String 字符串可以任意长度的。它可以包含任意的字节集,包含空字节。ClickHouse中的String类型可以代替其他DBMS中的VARCHAR、
BLOB、CLOB等类型。
FixedString(N)固定长度 N 的字符串,N必须是严格的正⾃然数。当服务端读取长度⼩于N的字符串时候,通过在字符串末尾添加空字节来达到N字节长度。当服务端读取长度⼤于N的字符串时候,将返回错误消息。与String相⽐,极少会使⽤FixedString,因为使⽤起来不是很⽅便。1)在插⼊数据时,如果字符串包含的字节数⼩于N,将对字符串末尾进⾏空字节填充。如果字符串包含的字节数⼤于N,将抛Too large
value for FixedString(N)异常。
2)在查询数据时,ClickHouse不会删除字符串末尾的空字节。如果使⽤WHERE⼦句,则须要⼿动添加空字节以匹配FixedString的值
(例如:where a=’abc\0’)。
注意,FixedString(N)的长度是个常量。仅由空字符组成的字符串,函数length返回值为N,⽽函数empty的返回值为1。
6 UUID
ClickHouse⽀持UUID类型(通⽤唯⼀标识符),该类型是⼀个16字节的数字,⽤于标识记录。ClickHouse内置generateUUIDv4函数来⽣成UUID值,UUID数据类型仅⽀持String数据类型也⽀持的函数(例如,min,max和count)。
7 Date类型
ClickHouse⽀持Date类型,这个⽇期类型⽤两个字节存储,表⽰从 1970-01-01 (⽆符号) 到当前的⽇期值。允许存储从 Unix 纪元开始到编译阶段定义的上限阈值常量(⽬前上限是2106年,但最终完全⽀持的年份为2105),最⼩值输出为0000-00-00。⽇期类型中不存储时区信息。
8 DateTime类型
ClickHouse⽀持DataTime类型,这个时间戳类型⽤四个字节(⽆符号的)存储Unix时间戳。允许存储与⽇期类型相同范围内的值,最⼩值为0000-00-00 00:00:00。时间戳类型值精确到(不包括闰秒)。
使⽤客户端或服务器时的系统时区,时间戳是从⽂本转换为⼆进制并返回。在⽂本格式中,有关夏令时的信息会丢失。
默认情况下,客户端连接到服务的时候会使⽤服务端时区。您可以通过启⽤客户端命令⾏选项--use_client_time_zone 来设置使⽤客户端时间。
因此,在处理⽂本⽇期时(例如,在保存⽂本转储时),请记住在夏令时更改期间可能存在歧义,如果时区发⽣更改,则可能存在匹配数据的问题。
9 枚举类型
ClickHouse⽀持Enum8和Enum16两种枚举类型。Enum保存的是’string’=integer的对应关系。在 ClickHouse中,尽管⽤户使⽤的是字符串常量,但所有含有Enum 数据类型的操作都是按照包含整数的值来执⾏,这在性能⽅⾯⽐使⽤String数据类型更有效。
在ORDER BY、GROUP BY、IN、DISTINCT等函数中,Enum 的⾏为与相应的数字作⽤相同。例如,按数字排序。对于等式运算符和⽐较运算符,Enum 的⼯作机制与它们在底层数值上的⼯作机制
相同。
Enum中的字符串和数值都不允许为NULL,当声明表字段时使⽤Nullable类型包含Enum类型时,在插⼊数据时允许NULL值。Enum类型提供toString函数来返回字符串值;toT函数可以转换为数值类型,T表⽰⼀个数值类型,如果T恰好对应Enum底层的数值类型则这个转换是0成本的。Enum类型可以使⽤Alter⽆成本修改对应集合的值,可以使⽤Alter来添加或删除Enum的成员(出于安全保障,如果改变之前⽤过的Enum会报异常),也可以⽤Alter将Enum8转换为Enum16或反之。
数据类型String=Integer对应关系取值范围unicode文件格式
Enum8‘String’= Int8-128 ~ 127
Enum16‘String’= Int16-32768 ~ 32767
创建tbl_test_enum表
create table tbl_test_enum(
e1 Enum8('male'=1,'female'=2),
e2 Enum16('hello'=1,'word'=2),
e3 Nullable(Enum8('A'=1,'B'=2)),
e4 Nullable(Enum16('a'=1,'b'=2))
)engine=TinyLog;
插⼊字符串数据
insert into tbl_test_enum values('male','hello','A',null),('male','word',null,'a'),(2,1,'C',null);
查询结果
select*from tbl_test_enum;
10 数组类型
ClickHouse⽀持Array(T)类型,T可以是任意类型,包括数组类型,但不推荐使⽤多维数组,因为对其的⽀持有限(MergeTree引擎表不⽀持存储多维数组)。T要求是兼容的数据类型,因为ClickHouse会⾃动检测并根据元素内容计算出存储这些数据的最⼩数据类型,如:不能使⽤array(1,’hello’)。
数组声明的两种⽅式
select array(1,3,5)as arr1,
[2,4,6]as arr2,
toTypeName(arr1)as arrType1,
toTypeName(arr2)as arrType2;
11 AggregateFunction类型
-- AggregateFunction(name,type_of_arguments)
create table aggMT (
whatever Date default'2019-12-18',
key String,
value String,
first AggregateFunction(min,DateTime),
last AggregateFunction(max,DateTime),
total AggregateFunction(count,UInt64)
)ENGINE=AggregatingMergeTree(whatever,(key,value),8192);
-- 插⼊数据
insert into aggMT (key,value,first,last,total)select'test','1.2.3.4',minState(toDateTime(1576654217)),maxState(toDateTime(1576654217)),countState(cast( 1as UInt64));
insert into aggMT (key,value,first,last,total)select'test','1.2.3.5',minState(toDateTime(1576654261)),maxState(toDateTime(1576654261)),countState(cast( 1as UInt64));
insert into aggMT (key,value,first,last,total)select'test','1.2.3.6',minState(toDateTime(1576654273)),maxState(toDateTime(1576654273)),countState(cast( 1as UInt64));
-- 查询
select key,value,minMerge(first),maxMerge(last),countMerge(total)from aggMT group by key,value;
12 元组类型
ClickHouse提供Tuple类型⽀持,Tuple(T1,T2…)中每个元素都可以是单独的类型。除了内存表以外,元组中不可以嵌套元组,但可以⽤于临时列分组。在查询中,使⽤IN表达式和带特定参数的lambda函数可以来对临时列进⾏分组。元组可以是查询的结果。在这种情况下,对于JSON以外的⽂本格式,括号中的值是逗号分隔的。在JSON格式中,元组作为数组输出(在⽅括号中)。在动态创建元组
时,ClickHouse 会⾃动为元组的每⼀个参数赋予最⼩可表达的类型。如果参数值为NULL则这个元组对应元素类型是Nullable。
使⽤元组的例⼦1:
select tuple(1,'a')as x, toTypeName(x);
使⽤元组传⼊null值时⾃动推断类型例⼦2:
select tuple(1,null)as x, toTypeName(x);
13 Nullable类型
ClickHouse⽀持Nullable类型,该类型允许⽤NULL来表⽰缺失值。Nullable字段不能作为索引列使⽤,在ClickHouse的表中存储Nullable列时,会对性能产⽣⼀定影响。
默认情况下,字段是不允许为NULL的。例如有个Int8类型的字段,在插⼊数据时有可能为NULL,需要将字段类型声明为Nullable(Int8)。
创建测试表tbl_test_nullable
create table tbl_test_nullable(f1 String, f2 Int8, f3 Nullable(Int8))engine=TinyLog;
插⼊⾮null值到tbl_test_nullable表(成功)
insert into tbl_test_nullable(f1,f2,f3)values('NoNull',1,1);
f1字段为null值时插⼊到tbl_test_nullable表(失败)
insert into tbl_test_nullable(f1,f2,f3)values(null,2,2);
f2字段为null值时插⼊到tbl_test_nullable表(失败)
insert into tbl_test_nullable(f1,f2,f3)values('NoNull2',null,2);
f3字段为null值时插⼊到tbl_test_nullable表(成功)
insert into tbl_test_nullable(f1,f2,f3)values('NoNull2',2,null);
查询tbl_test_nullable表
select*from tbl_test_nullable;
14 嵌套数据结构
ClickHouse⽀持嵌套数据结构,可以简单地把嵌套数据结构当做是所有列都是相同长度的多列数组。创建表时,可以包含任意多个嵌套数据结构的列,但嵌套数据结构的列仅⽀持⼀级嵌套。嵌套列在insert时,需要把嵌套列的每⼀个字段以[要插⼊的值]格式进⾏数据插⼊。
创建带嵌套结构字段的表
create table tbl_test_nested(
uid Int64,
ctime date,
user Nested(name String, age Int8, phone Int64),
Sign Int8
)engine=CollapsingMergeTree(ctime,intHash32(uid),(ctime,intHash32(uid)),8192,Sign);
插⼊数据
insert into tbl_test_nested values(1,'2019-12-25',['zhangsan'],[23],[138********],1);
查询uid=1并且user嵌套列的age>=20的数据
select*from tbl_test_nested where uid=1and arrayFilter(u -> u >=20,user.age)!=[];
查询user嵌套列name=zhangsan的数据
select*from tbl_test_nested where hasAny(user.name,['zhangsan']);
模糊查询user嵌套列name=zhang的数据
select*from tbl_test_nested where arrayFilter(u -> u like'%zhang%',user.name)!=[];
15 interval
Interval是ClickHouse提供的⼀种特殊的数据类型,此数据类型⽤来对Date和Datetime进⾏运算,不能使⽤Interval类型声明表中的字段。
Interval⽀持的时间类型有SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER和YEAR。对于不同的时间类型参数,都有⼀个单独的数据类型,如下表格。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。