1.整型
分为有符号整型和无符号整型
有符号整型
clickhouse类型 | 范围 | 对应 |
Int8 | [-128,127] | 1字节 |
Int16 | [-32768,32767] | short |
Int32 | [-2147483648 : 2147483647] | int |
Int64 | [-9223372036854775808 : 9223372036854775807] | long |
无符号整型
UInt8 | [0,255] |
UInt16 | [0 : 65535] |
UInt32 | [0 : 4294967295] |
UInt64 | [0 : 18446744073709551615] |
2.浮点型
Float32 | float |
Float64 | double |
尽量以整数形式存储数据。如将固定精度的数字转换为整数值,如时间用毫秒为单位表示,因为浮点数进行计算时可能引起四舍五入的误差。
3.布尔型
没有单独的类型来存储布尔值,可以使用UInt8类型,取值限制为0和1
4.Decimal类型
有符号的浮点数,可在加减和乘法运算中保持精度。对于除法,最低有效数字会被丢弃(不四舍五入)。
有3种声明:
- Decimal32(s):整数+小数位置9位,s表示小数位置的数量
- Decimal64(s):整数+小数位置共18位,s表示小数位置的数量
- Decimal128(s):整数+小数位置共38位,s表示小数位置的数量
123.123236
使用Decimal32(5)表示的话,值为123.12324
因为小数位置为5位,多余的丢弃,没有四舍五入
使用场景:一般金额字段、汇率,利率等字段为了保证小数点精度,都使用Decimal进行存储
5.字符串
string:
字符串可以是任意长度的,包括空字节
FixedString(N):
固定长度为N的字符串,N必须是严格的正自然数,当服务端读取长度小于N的字符串的时候,通过在字符串末尾添加空字节来达到N字节长度。当服务器读取长度大于N的字符串的时候,将返回错误信息。
与String相比,FixedString极少使用,因为使用起来很不方便。
使用场景:名称、文字描述、字符型编码。固定长度的可以保存一些定长的内容,比如一些编码,性别等,但是考虑到一定的变化风险,很少使用。
6枚举类型
包括Enum8和Enum16两种类型,Enum保存’string‘=integer的对应关系。
Enum8用'String'=Int8对描述。
Enum16用'String'=Int16对描述
示例如下:
1)创建一个带有枚举Enum8('hello'=1,'world'=2)类型的列的表
create table t_enum( x Enum('hello'=1,'world'=2)) ENGINE=TinyLog;
2)这个列只能存储类型定义中列出的值:'hello'或'world'
insert into t_enum values('hello'),('world'),('hello');
select * from t_enum;
3)如果插入其他值,则抛出异常
insert into t_enum values('a');
4)如果要看对应行的数值,需要将Enum只转换为整数类型
这里的数组指的是类型定义中指定的值
select cast(x,'Int8') from t_enum;
使用场景:对一些状态、类型的字段算是一种空间优化,也算是一种数据约束。实际中往往因为一些数据内容的变化增加一定的维护成本,甚至是数据丢失问题。谨慎使用。
7.时间类型
clickhouse有3种时间类型
- Date:接收年-月-日的字符串比如 ’2019-02-20‘
- Datetime:接收年-月-日 时:分:秒的字符串 比如'2019-02-20 02:20:58'
- Datetime64:接收年-月-日 时:分:秒.亚秒的字符串 比如'2019-02-20 02:20:58.56'
日期类型,用2个字节存储,表示从1970-01-01到当前的日期值。
8.数组
Array(T):由T类型元素组成的数组。T可以是任意类型,包含数组类型。但不推荐使用多维数组,clickhouse对多维数组的支持有限。如不能在MergeTree表中存储多维数组
clickhouse定义数组时,不需要声明数组里装的是什么类型的数据,会自动推导出数据类型,当推导出的数据类型不兼容时,会报错。也可以明确指出Array的数据类型,如Array(Int8)。
toTypeName用来获取字段的数据类型。
创建数组有2种方式,使用()或方括号[]
//字符串
select array('1','2') as x ,toTypeName(x);
select ['1','2'] as x,toTypeName(x);
其他示例:
//字符串
select ('1','2') as x,toTypeName(x);
select ['1','2'] as x,toTypeName(x);
//整型数组
select array(1,2) as x,toTypeName(x);
select [1,2] as x,toTypeName(x);
///浮点型
select [1.2,2.4,4.6] as x,toTypeName(x);//推导出float64
///混合整数和浮点数
select [1,3.14] as x,toTypeName(x);///推导出float64
select [1,1.24,'a'] as x,toTypeName(x);报错
数组类型实例:
//建表
create table test_array(
provice String,
city Array(String),
gdp Array(UInt8)
)ENGINE=Log;
//插入数据
insert into table test_array values('henan',['zhengzhou','zhoukou'],[1,2]),('hebei',['shijiazhuang','baoding','tangshan'],[1,4,5]);
insert into table test_array values ('beijing',[],[10]),('chongqing',[],[9]);
//查询
select * from test_array;
//使用array join将数组内的一行数据转化为多行
select * from test_array array join city as c;
9.元组
clickhouse支持元组数据类型tuple,元组内的数据类型不要求兼容
select tuple(3.14, 'pai', now()) as t, toTypeName(t)
select (3.14, 'pai', now()) as t, toTypeName(t)
10.嵌套
clickhouse支持嵌套数据类型Nested。可以为一个表定一个或多个嵌套数据类型字段,但是每个嵌套字段只支持一级嵌套。嵌套一般用来表示简单的级联关系。嵌套本质上是一个多维数组。
如创建一个表,一个1属于多个部门
-- department为嵌套数据类型,其中
-- department.id为部门ID
-- department.name为部门名称
create table employee ( \
name String, \
age UInt8, \
department Nested ( \
id UInt8, \
name String \
) \
) engine = Memory;
插入数据
-- 插入数据
insert into employee values('Tom', 26, [11,12], ['开发部', '测试部']);
-- 查询数据
select * from employee where name = 'Tom';
-- 用Array Join来将一行数据变多行,适用于行转列操作
select dept.id, dept.name \
from employee array join department as dept \
where name = 'Tom';
select name, dept.id, dept.name \
from employee array join department as dept \
where name = 'Tom';
array join介绍:array join子句允许在数据表的内部,与数组或者嵌套的字段进行join操作,从而将一行数据变成多行。
11.Nullable
ClickHouse用Nullable
来修饰基础类型,表示该字段允许为null。
使用Nullable类型,会导致性能下降。
Nullable(Int8)
12 Domain
ClickHouse支持IPv4和IPv6两种领域数据类型,提供了自动格式检查和优化了性能。
IPv4格式:十进制表示,比如127.0.0.1
IPv6格式:十六进制表示
Domain类型并不是字符串类型,如果需要转换成字符串类型,需要调用IPv4NumToString()或IPv6NumToString()函数。