数据定义

 

ClickHouse的数据类型

ClickHouse是一款分析型数据库,有多种数据库类型,分为基础类型、复合类型和特殊类型。其中基础类型使用ClickHouse具备了描述数据的基本能力,而另外两种类型则是ClickHouse的数据表达能力更加丰富立体
 

基础类型

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

数值

数值类型:整型、浮点型和定点数三类

Int

常用Tinyint、Smallint、Int和Bigint指代整型的不同取值范围。而ClickHouse则直接使用Int8、Int16、Int32、Int64指代4种大小的Int类型,其末尾的数字正好表名了占用字节的大小(8位=1字节)
ClickHouse支持无符号的整型,使用前缀U表示

Float

ClickHouse直接使用Float32和Float64代表单精度浮点数以及双精度浮点数
在使用浮点数的时候,应当要意识到它是有限精度的。例如,分别对Float32、Float64写入超过有效精度的值,会发生什么事?将拥有20位小数的数值分别写入Float32和Float64,此时结果就会出现数据误差

Decimal

如果要求更高精度的数值运算,则需要使用定点数。ClickHouse提供了Decimal32、Decimal64、Decimal128.可以通过两种形式声明定点:简写方式有Decimal32(S)、Decimal64(S)、Decimal128(S)三种,原生方式Decimal(P,S),其中:
P代表精度,决定总位数(整数部分+小数部分),取值范围是1~38
S代表规模,决定小数位数,取值范围是0~P
在使用定点数时还有一点值得注意:由于现代计算机系统只支持32位和64位CPU,所以Decimal128是在软件层面模拟实现,它的速度会明显慢于Decimal32与Decimal64
 

字符串类型

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

String

字符串由String定义,长度不限。使用String的时候无须声明大小。他完全代替了传统意义上数据库的Varcaht、Text、Clob和Blob等字符类型。String类型不限定字符串,所以可以将任意编码的字符串存入其中。但是为了程序的规范性和可维护性,在同一套程序中应遵循使用统一的编码,例如“UTF-8”

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还提供了数组、元祖、枚举和嵌套四类复合类型。这些类型通常是其他数据库原生不具备的特性。拥有了复合类型之后,ClickHouse的数据模型表达能力更强

Array

数组有两种定义形式,常规方式array(T)或者[T]
ClickHouse数组拥有类型推断的能力,推断类型:以最小的存储代价为原则,即使用最小可表达的数据类型。例如array[1, 2]会通过自动推断将UInt8作为数组类型。但是数组元素中如果存在Null值,则元素将变为Nullable。
一个数组内可以包含多种数据类型,例如[1, 2.0],是可行的,但是各类型之间必须兼容,例如[1, '2']则会报错

Tuple

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

Enum

ClickHouse支持枚举类型,这是一种定义常量时经常会使用数据类型。ClickHouse提供了Enum8和Enum16两种枚举类型,他们除了取值范围不同之外,没有其他不同。枚举固定使用(String:int)key/value键值对的形式定义数据,所以Enum8和Enum16分别对应(String:Int8)和(String:Int16)
Key和Value是不允许重复的,要确保唯一性。其次,Key和Value的值都不能为null,但Key允许是空字符串。在写入枚举的时候,只会用到key字符串部分
在数据写入过程中,会对照枚举集合项的内容逐一检查。如果Key字符串不在集合范围内则会抛出异常
是否可以使用String代替枚举?出于性能的考虑,因为虽然枚举定义中key属于string类型,但是在后续对枚举的操作中(排序、去重、分组等),会使用Int类型的Value值

Nested

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

特殊类型

Nullable,并不是一个独立类型,一种辅助修饰符,与基础类型一起使用,表示某个基础数据类型可以是Null值,不能用于数组和元组这些复合类型,也不能作为索引字段,其次,应该慎用Nullable类型,包括Nullable的数据表,不然会使查询和写入性能变慢,正常情况下,每个列字段的数据会被存储在对应[Column].bin文件中,如果一个列字段被Nullable类型修饰后,会额外生成一个[Collumn].null.bin文件专门保存它的null值,这意味着在读取和写入数据时,需要一倍的额外文件操作
Domain,IPv4和IPv6两类,本质上它们是对整型和字符串进一步封装,IPv4类型是基于UInt32封装的。和存储字符串存储不同的是?1. 出于便捷性的考虑,例如IPv4支持支持格式检查,格式错误IP数据是无法被写入的,2. 出于性能的考量,同样以IPv4为例,IPv4使用UInt32存储,相比String更加紧凑,占用的空间跟小,查询性能更快,IPv6类型是基于FixedString(16)封装的,它的使用方法与IPv4别无二致。Domain看上去是string,但Domain类型并不是字符串,所以它不支持隐式的自动类型转换,如果需要返回IP的字符串形式,显示调用IPv4NumToString或IPv6NumToString函数进行转换

ClickHouse数据定义的更多相关文章

  1. ClickHouse数据库数据定义手记之数据类型

    前提 前边一篇文章详细分析了如何在Windows10系统下搭建ClickHouse的开发环境,接着需要详细学习一下此数据库的数据定义,包括数据类型.DDL和DML.ClickHouse作为一款完备的D ...

  2. 基于腾讯云存储COS的ClickHouse数据冷热分层方案

    一.ClickHouse简介 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS),支持PB级数据量的交互式分析,ClickHouse最初是为YandexMetrica ...

  3. 使用 Apache Superset 可视化 ClickHouse 数据

    Apache Superset是一个强大的BI工具,它提供了查看和探索数据的方法.它在 ClickHouse 用户中也越来越受欢迎. 我们将介绍安装 Superset 的 2 种方法,然后展示如何从 ...

  4. ClickHouse(02)ClickHouse架构设计介绍概述与ClickHouse数据分片设计

    ClickHouse核心架构设计是怎么样的?ClickHouse核心架构模块分为两个部分:ClickHouse执行过程架构和ClickHouse数据存储架构,下面分别详细介绍. ClickHouse执 ...

  5. Oracle language types(语言种类) 表的相关操作 DDL数据定义语言

    数据定义语言 Data Definition Language Statements(DDL)数据操纵语言 Data Manipulation Language(DML) Statements事务控制 ...

  6. 《how to design programs》15章 相互引用的数据定义

    由结构体组成的表与结构体中的表. 在用追溯形式建立家家谱树时,我们通常从某个后代除法,依次处理它的父母,组父母等.而构建树时,我们会不断添加谁是谁的孩子,而不是写出谁是谁的父母,从而建立一颗后代家谱树 ...

  7. SQL语言学习-数据定义语言

    Sql语言至今已经有6个版本.SQL查询语言包括了所有对数据的操作命令,这些操作可分为四类:数据定义语言(DDL).数据操纵语言(DML).数据控制语言(DCL)和嵌入式SQL语言. 数据定义语言(D ...

  8. Python学习记录----数据定义

    摘要: 描述Python中数据定义格式,需要注意的东东. 一 数据声明 Python木有一般语言的具体数据类型,像char,int,string这些通通木有.这有点像javascript,但又不同,j ...

  9. 跟我一起读postgresql源码(七)——Executor(查询执行模块之——数据定义语句的执行)

    1.数据定义语句的执行 数据定义语句(也就是之前我提到的非可优化语句)是一类用于定义数据模式.函数等的功能性语句.不同于元组增删査改的操作,其处理方式是为每一种类型的描述语句调用相应的处理函数. 数据 ...

随机推荐

  1. 微信小程序实现tabs选项卡

    选项卡在我们的日常开发中,使用的还是蛮多的,但是微信小程序中却没有直接提供选项卡组件,不过我们可以变通通过 scroll-view 和 swiper 组件来实现一个选项卡的功能. 需求: 实现一个选项 ...

  2. 多边形——————区间dp

    原题链接:https://www.acwing.com/problem/content/285/ 题意简单来说就是:给你一个环,断掉一条边使其成为一个链,用这个链跑dp,求最大得分. 首先这不是一道板 ...

  3. 2021.8.3考试总结[NOIP模拟29]

    T1 最长不下降子序列 数据范围$1e18$很不妙,但模数$d$只有$150$,考虑从这里突破. 计算的式子是个二次函数,结果只与上一个值有关,而模$d$情况下值最多只有$150$个,就证明序列会出现 ...

  4. 大牛针对零基础入门c语言详解指针(超详细)

    C语言指针说难不难但是说容易又是最容易出错的地方,因此不管是你要做什么只要用到C指针你就跳不过,今天咱们就以 十九个例子来给大家简单的分析一下指针的应用,最后会有C语言视频资料提供给大家更加深入的参考 ...

  5. 【做题记录】[NOIP2011 提高组] 观光公交

    P1315 [NOIP2011 提高组] 观光公交 我们想在 \(k\) 次加速每一次都取当前最优的方案加速. 考虑怎样计算对于每一条边如果在当前情况下使用加速器能够使答案减少的大小. 如果当前到达某 ...

  6. 『学了就忘』Linux基础 — 9、虚拟机中快照的使用

    目录 1.快照的含义 2.快照的使用 步骤一:创建拍摄快照 步骤二:填写快照信息并创建 步骤三:查看快照 步骤四:操作快照 3.管理虚拟机小技巧 4.关于快照说明 快照和克隆是VMware中两个非常实 ...

  7. Qt信号与槽传递自定义数据类型——两种解决方法

    信号与槽作为qt中的核心机制,在qt应用开发中经常会用的,但是原生的信号与槽连接传参,只支持基本的数据类型,比如char,int, float,double. 如果想要在信号与槽之间传递自定义参数,比 ...

  8. 最短路计数(SPFA× Dijkstra√)

    题目描述 给出一个n个顶点m条边的无向无权图,顶点编号为1−n.问从顶点1开始,到其他每个点的最短路有几条. 输入格式 第一行包含2个正整数n,m,为图的顶点数与边数. 接下来M行,每行2个正整数x, ...

  9. Atcoder 题目泛做

    我思维越来越菜了,这样下去感觉要退役了. 听说Atcoder的题练思维?那就试着做一做吧. 坚持每天一两道吧.(很有可能咕掉.) AGC036 官方题解 ---A-Triangle          ...

  10. hdu 2154 跳舞毯(简单DP)

    题意: 有一个圆圆的毯,被平均分成三个扇形.分为标记为A,B,C. 小余从A开始跳,每次可跳到相邻的扇形上.(A->B 或 A->C) 问小余跳n次,最后回到扇形A的方案数是多少. 思路: ...