数据定义

 

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. Scrum Meeting 10

    第10次例会报告 日期:2021年05月30日 会议主要内容概述: 目前组员均无暇软工,进展较慢. 一.进度情况 我们采用日报的形式记录每个人的具体进度,链接Home · Wiki,如下记录仅为保证公 ...

  2. 三极管和MOS管驱动电路的正确用法

    1 三极管和MOS管的基本特性 三极管是电流控制电流器件,用基极电流的变化控制集电极电流的变化.有NPN型三极管(简称P型三极管)和PNP型三极管(简称N型三极管)两种,符号如下: MOS管是电压控制 ...

  3. STM32单片机的学习方法(方法大体适用所有开发版入门)

    1,一款实用的开发板. 这个是实验的基础,有时候软件仿真通过了,在板上并不一定能跑起来,而且有个开发板在手,什么东西都可以直观的看到,效果不是仿真能比的.但开发板不宜多,多了的话连自己都不知道该学哪个 ...

  4. cf 24 Game (观察+.. 想一想)

    题意: 给一个数N,从1到N. 每次取两个数,三种操作:加.减.乘,运算完得一个数,把那俩数删了,把这个数加进去. 重复操作N-1次. 问是否可能得到24.若可以,输出每一步操作. 思路: 小于4,不 ...

  5. 二,zabbix与php的一些问题

    zabbix 检查先决条件 一.php-bcmath 不支持 php 安装 bcmath 扩展(编译安装) PHP的linux版本需要手动安装BCMath扩展,在PHP的源码包中默认包含BCMath的 ...

  6. K8S在线部署含Dashborad

    参考文章 https://www.kubernetes.org.cn/5462.html 前言 Kubernetes作为容器编排工具,简化容器管理,提升工作效率而颇受青睐.很多新手部署Kubernet ...

  7. oracle 数据库修改端口号1521

    1.关闭监听 2.修改配置文件,port=1933 #vi $ORACLE_HOME/network/admin/listener.ora 3.登录并查看local_listener参数,因为使用的是 ...

  8. istio ServiceMesh

    什么是ServiceMesh?什么是Istio? 微服务的一种概念,随着微服务的来临,衍生出一系列的问题,比如服务发现.负载均衡.路由.流量控制.服务间通讯的可靠性.微服务的监控等一系列的问题.使用a ...

  9. JavaScript 事件循环

    JavaScript 事件循环 事件循环 任务队列 async/await 又是如何处理的呢 ? 定时器问题 阻塞还是非阻塞 实际应用案例 拆分 CPU 过载任务 进度指示 在事件之后做一些事情 事件 ...

  10. 关于使用idea工具debug时,断点颜色由红色变成灰色

    在使用断点调试的时候,发现断点由原来的红色变成灰色的,后来发现是由于错误操作将Debug断点t调试禁用了 ,只需要点击禁用按钮取消就可以了