ClickHouse属于分析型数据库,ClickHouse提供了许多数据类型,它们可以划分为基础类型、复合类型和特殊类型。其中基础类型使ClickHouse具备了描述数据的基本能力,而另外两种类型则使ClickHouse的数据表达能力更加丰富立体。

基础类型

基础类型只有数值、字符串和时间三种类型,没有Boolean类型,但可以使用整型的0或1替代。

数值类型

数值类型分为整数、浮点数和定点数三类,接下来分别进行说明。

Int

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



Float

与整数类似,ClickHouse直接使用Float32和Float64代表单精度浮点数以及双精度浮点数。在使用浮点数的时候,要意识到它是有限精度的。对Float32和Float64写入超过有效精度的数值,结果就会出现数据误差,会被截断。

另外,ClickHousae对于正无穷、负无穷、以及非数值类型的表示。

  • 正无穷:inf
  • 负无穷:-inf
  • 非数值类型:

Decimal

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

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

字符串类型

字符串类型可以细分为String、FixedString和UUID三类。

String

字符串由String定义,长度不限。因此在使用String的时候无须声明大小。它完全代替了传统意义上数据库的Varchar、Text、Clob和Blob等字符类型。String类型不限定字符集,因为它根本就没有这个概念,所以可以将任意编码的字符串存入其中。

FixedString

FixedString类型和传统意义上的Char类型有些类似,对于一些字符有明确长度的场合,可以使用固定长度的字符串。定长字符串通过FixedString(N)声明,其中N表示字符串长度。但与Char不同的是,FixedString使用null字节填充末尾字符,而Char通常使用空格填充。比如在下面的例子中,字符串‘abc’虽然只有3位,但长度却是5,因为末尾有2位空字符填充。

UUID

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

时间类型

时间类型分为DateTime、DateTime64和Date三类。ClickHouse目前没有时间戳类型。时间类型最高的精度是秒,也就是说,如果需要处理毫秒、微秒等大于秒分辨率的时间,则只能借助UInt类型实现。

DateTime

DateTime类型包含时、分、秒信息,精确到秒。

DateTime64

DateTime64可以记录亚秒,它在DateTime之上增加了精度的设置。

Date

Date类型不包含具体的时间信息,只精确到天。

复合类型

ClickHouse还提供了数组、元组、枚举和嵌套四类复合类型。

数组Array

数组有两种定义形式,常规方式array(T),或者简写方式[T]。在同一个数组内可以包含多种数据类型,例如数组[1,2.0]是可行的。但各类型之间必须兼容,例如数组[1,'2']则会报错。

在查询时并不需要主动声明数组的元素类型。因为ClickHouse的数组拥有类型推断的能力,推断依据:以最小存储代价为原则,即使用最小可表达的数据类型。

  1. --常规定义方式
  2. SELECT array(1, 2) as a , toTypeName(a)
  3. ┌─a───┬─toTypeName(array(1, 2))─┐
  4. [1,2] Array(UInt8)
  5. └─────┴────────────────┘
  6. --简写定义方式
  7. SELECT [1, 2]
  8. --建表时数据类型定义
  9. CREATE TABLE Array_TEST (
  10. c1 Array(String)
  11. ) engine = Memory

元组Tuple

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

  1. --常规定义方式
  2. SELECT tuple(1,'a',now()) AS x, toTypeName(x)
  3. ┌─x─────────────────┬─toTypeName(tuple(1, 'a', now()))─┐
  4. (1,'a','2019-08-28 21:36:32') Tuple(UInt8, String, DateTime)
  5. └───────────────────┴─────────────────────┘
  6. --简写定义方式
  7. SELECT (1,'a',now()) AS x, toTypeName(x)
  8. ┌─x─────────────────┬─toTypeName(tuple(1, 'a', now()))─┐
  9. (1,'a','2019-08-28 21:36:32') Tuple(UInt8, String, DateTime)
  10. └───────────────────┴─────────────────────┘
  11. --建表时元组类型定义
  12. CREATE TABLE Array_TEST (
  13. c1 Array(String)
  14. ) engine = Memory

枚举Enum

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

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

数据在写入的过程中,会对照枚举集合项的内容逐一检查。如果Key字符串不在集合范围内则会抛出异常。

为什么还需要专门的枚举类型呢?这是出于性能的考虑。因为枚举定义中的Key属于String类型,但在后续对枚举的所有操作中(包括排序、分组、去重、过滤等),会使用Int类型的Value值。

  1. --枚举类型定义
  2. CREATE TABLE Enum_TEST (
  3. c1 Enum8('ready' = 1, 'start' = 2, 'success' = 3, 'error' = 4)
  4. ) ENGINE = Memory;
  5. --枚举类型插入
  6. INSERT INTO Enum_TEST VALUES('ready');
  7. INSERT INTO Enum_TEST VALUES('start');

嵌套Nested

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

  1. --创建Nested语句
  2. CREATE TABLE nested_test (
  3. name String,
  4. age UInt8 ,
  5. dept Nested(
  6. id UInt8,
  7. name String
  8. )
  9. ) ENGINE = Memory;

ClickHouse的嵌套类型和传统的嵌套类型不相同,导致在初次接触它的时候会让人十分困惑。以上面这张表为例,如果按照它的字面意思来理解,会很容易理解成nested_test与dept是一对一的包含关系,其实这是错误的。

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

插入数据时候每一个nestd字段要需要一个数组。

  1. --插入数据
  2. INSERT INTO nested_test VALUES ('bruce' , 30 , [10000,10001,10002], ['研发部','技术支持中心','测试部']);
  3. --行与行之间,数组长度无须对齐
  4. INSERT INTO nested_test VALUES ('bruce' , 30 , [10000,10001], ['研发部','技术支持中心']);
  5. --查询数据
  6. SELECT name, dept.id, dept.name FROM nested_test
  7. ┌─name─┬─dept.id──┬─dept.name─────────────┐
  8. bruce [16,17,18] ['研发部','技术支持中心','测试部']
  9. └────┴───────┴────────────────────┘

特殊数据类型

Nullable

Nullable并不能算是一种独立的数据类型,它更像是一种辅助的修饰符,需要与基础数据类型一起搭配使用。Nullable类型与Java8的Optional对象有些相似,它表示某个基础数据类型可以是Null值。

  1. CREATE TABLE Null_TEST (
  2. c1 String,
  3. c2 Nullable(UInt8)
  4. ) ENGINE = TinyLog;
  5. --通过Nullable修饰后c2字段可以被写入Null值:
  6. INSERT INTO Null_TEST VALUES ('nauu',null)
  7. INSERT INTO Null_TEST VALUES ('bruce',20)
  8. SELECT c1 , c2 ,toTypeName(c2) FROM Null_TEST
  9. ┌─c1───┬───c2─┬─toTypeName(c2)─┐
  10. nauu NULL Nullable(UInt8)
  11. bruce 20 Nullable(UInt8)
  12. └─────┴──────┴───────────┘

Domain

域名类型分为IPv4和IPv6两类,本质上它们是对整型和字符串的进一步封装。IPv4类型是基于UInt32封装的。

ClickHouse相关资料分享

ClickHouse经典中文文档分享

参考文章

ClickHouse(05)ClickHouse数据类型详解

ClickHouse(05)ClickHouse数据类型详解的更多相关文章

  1. oracle 数据类型详解---日期型(转载)

    oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享: 注:由于INTER ...

  2. MySQL 数据类型 详解

    MySQL 数据类型 详解 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 My ...

  3. python之数据类型详解

    python之数据类型详解 二.列表list  (可以存储多个值)(列表内数字不需要加引号) sort s1=[','!'] # s1.sort() # print(s1) -->['!', ' ...

  4. python 数据类型详解

    python数据类型详解 参考网址:http://www.cnblogs.com/linjiqin/p/3608541.html 目录1.字符串2.布尔类型3.整数4.浮点数5.数字6.列表7.元组8 ...

  5. redis详解(二)-- 数据类型详解

    Redis常用数据类型详解 1,Redis最为常用的数据类型主要有以下: String Hash List Set Sorted set pub/sub Transactions 在具体描述这几种数据 ...

  6. python数据类型详解(全面)

    python数据类型详解 目录1.字符串2.布尔类型3.整数4.浮点数5.数字6.列表7.元组8.字典9.日期 1.字符串1.1.如何在Python中使用字符串a.使用单引号(')用单引号括起来表示字 ...

  7. 转 python数据类型详解

    python数据类型详解 目录 1.字符串 2.布尔类型 3.整数 4.浮点数 5.数字 6.列表 7.元组 8.字典 9.日期 1.字符串 1.1.如何在Python中使用字符串 a.使用单引号(' ...

  8. 2-2和2-3基本数据类型 & 2-4基本数据类型详解 & 3-1和3-2整形字面量值及变量声

    2-4基本数据类型详解 3-1和3-2整形字面量值及变量声 023是八进制的 0x1357是十六进制 0X3C也是十六进制 0x1abL:长整型 变量声明 数据类型 空格 变量名 赋值: 变量的定义:

  9. Python数据类型详解——列表

    Python数据类型详解--列表 在"Python之基本数据类型概览"一节中,大概介绍了列表的基本用法,本节我们详细学一下列表. 如何定义列表:在[]内以英文里输入法的逗号,,按照 ...

随机推荐

  1. 一文get到SOLID原则的重点

    ​ 最近没事再次翻开<敏捷软件开发:原则.模式与实践>看,发现以前似懂非懂的东西突然就看懂了,get到了讲的重点. SOLID(单一职责原则.开放-封闭原则.里氏替换原则.接口隔离原则以及 ...

  2. Python-安装lmdb失败-解决方法

    使用pip install lmdb 时报错 ERROR: Command errored out with exit status 1: python setup.py egg_info Check ...

  3. zabbix主动式和被动式

    推荐: zabbix我们使用主动式,主动式的话,可以把压力都分散到agent上,压力小. 1: zabbix主动式和被动式是相对于agent来说的. zabbix server去获取zabbix ag ...

  4. Vue动态组件的实践与原理探究

    我司有一个工作台搭建产品,允许通过拖拽小部件的方式来搭建一个工作台页面,平台内置了一些常用小部件,另外也允许自行开发小部件上传使用,本文会从实践的角度来介绍其实现原理. ps.本文项目使用Vue CL ...

  5. 没想到吧,Spring中还有一招集合注入的写法

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. Spring作为项目中不可缺少的底层框架,提供的最基础的功能就是bean的管理了.bean的注入相信大家都比较熟 ...

  6. 30m精度土壤类型、土壤质地、土壤有机质、土壤PH、土壤氮磷钾

    ​数据下载链接:数据下载链接 引言 全国土壤类型.质地.养分及变化等信息产品分为土壤类型数据.土壤质地数据.土壤养分数据及土壤变化数据等.该类产品是基于野外调查和实地采样,结合历史数据,建立全国土壤类 ...

  7. HashSet存储自定义类型元素和LinkedHashSet集合

    HashSet集合存储自定义类型元素 HashSet存储自定义类型元素 set集合报错元素唯一: ~存储的元素(String,Integer,-Student,Person-)必须重写hashCode ...

  8. 07 MySQL_SQL语言分类

    SQL语言分类 DDL Data Definition Language 数据定义语言 包括: create , alter ,drop , truncate; 不支持事务 DML Data Mani ...

  9. Solution -「HDU」Professor Ben

    Description 有 \(Q\) 个询问.每次给定一个正整数 \(n\),求它的所有因数的质因数个数的和. Solution 就讲中间的一个 Trick. 我们定义正整数 \(x\) 有 \(f ...

  10. Jenkins性能优化

    jenkins性能优化 1.评估安装插件,插件数量过多,会导致界面加载慢: 2.添加slave节点: 01.禁止在master上构建性能耗费大的任务,可以使用标签的方式使其在slave上构建: 02. ...