clickhouse4:数据类型

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.浮点型

Float32float
Float64double

尽量以整数形式存储数据。如将固定精度的数字转换为整数值,如时间用毫秒为单位表示,因为浮点数进行计算时可能引起四舍五入的误差。

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()函数。
 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值