数据定义
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数据库数据定义手记之数据类型
前提 前边一篇文章详细分析了如何在Windows10系统下搭建ClickHouse的开发环境,接着需要详细学习一下此数据库的数据定义,包括数据类型.DDL和DML.ClickHouse作为一款完备的D ...
- 基于腾讯云存储COS的ClickHouse数据冷热分层方案
一.ClickHouse简介 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS),支持PB级数据量的交互式分析,ClickHouse最初是为YandexMetrica ...
- 使用 Apache Superset 可视化 ClickHouse 数据
Apache Superset是一个强大的BI工具,它提供了查看和探索数据的方法.它在 ClickHouse 用户中也越来越受欢迎. 我们将介绍安装 Superset 的 2 种方法,然后展示如何从 ...
- ClickHouse(02)ClickHouse架构设计介绍概述与ClickHouse数据分片设计
ClickHouse核心架构设计是怎么样的?ClickHouse核心架构模块分为两个部分:ClickHouse执行过程架构和ClickHouse数据存储架构,下面分别详细介绍. ClickHouse执 ...
- Oracle language types(语言种类) 表的相关操作 DDL数据定义语言
数据定义语言 Data Definition Language Statements(DDL)数据操纵语言 Data Manipulation Language(DML) Statements事务控制 ...
- 《how to design programs》15章 相互引用的数据定义
由结构体组成的表与结构体中的表. 在用追溯形式建立家家谱树时,我们通常从某个后代除法,依次处理它的父母,组父母等.而构建树时,我们会不断添加谁是谁的孩子,而不是写出谁是谁的父母,从而建立一颗后代家谱树 ...
- SQL语言学习-数据定义语言
Sql语言至今已经有6个版本.SQL查询语言包括了所有对数据的操作命令,这些操作可分为四类:数据定义语言(DDL).数据操纵语言(DML).数据控制语言(DCL)和嵌入式SQL语言. 数据定义语言(D ...
- Python学习记录----数据定义
摘要: 描述Python中数据定义格式,需要注意的东东. 一 数据声明 Python木有一般语言的具体数据类型,像char,int,string这些通通木有.这有点像javascript,但又不同,j ...
- 跟我一起读postgresql源码(七)——Executor(查询执行模块之——数据定义语句的执行)
1.数据定义语句的执行 数据定义语句(也就是之前我提到的非可优化语句)是一类用于定义数据模式.函数等的功能性语句.不同于元组增删査改的操作,其处理方式是为每一种类型的描述语句调用相应的处理函数. 数据 ...
随机推荐
- 第一次Alpha Scrum Meeting
本次会议为Alpha阶段第一次Scrum Meeting会议 会议概要 会议时间:2021年4月22日 会议地点:北航Inspiration Space咖啡厅 会议时长:1小时 会议内容简介:本次会议 ...
- Beta阶段第八次会议
Beta阶段第八次会议 时间:2020.5.24 完成工作 姓名 工作 难度 完成度 ltx 1.修改一下小程序游客模式的风格 轻 80% xyq 1.针对昨天提出的意见对场地申请表格进行修改 中 9 ...
- netty入门实现简单的echo程序
最近看以往在程序中编写的代码,发现有一个功能是使用socket通讯来实现的,而那个时候使用的是基于bio的阻塞io来实现的,最近在看netty,发现可以使用netty来使用nio的方式来实现,此博客记 ...
- Noip模拟16 2021.7.15
题目真是越来越变态了 T1 Star Way To Heaven 首先,你要看出这是一个最小生成树的题(妙吧?) 为什么可以呢? 我们发现从两点连线的中点过是最优的,但是上下边界怎么办呢? 我们把上下 ...
- openmp学习心得(一)
主要在vs2015下使用OMP,写一些自己omp的学习心得: 一.在VS2015下OpenMP的使用: 1.VS2015也仅仅支持OpenMP2.0版本,VS对OpenMP的支持并不太好. 2.在VS ...
- insertion-sort-list leetcode C++
Sort a linked list using insertion sort. C++ /** * Definition for singly-linked list. * struct ListN ...
- hdu 2189 来生一起走(DP)
题意: 有N个志愿者.指挥部需要将他们分成若干组,但要求每个组的人数必须为素数.问不同的方案总共有多少.(N个志愿者无差别,即每个组的惟一标识是:人数) 思路: 假设N个人可分为K组,将这K组的人数从 ...
- SpringBoot 全局异常拦截捕获处理
一.全局异常处理 //Result定义全局数据返回对象 package com.xiaobing.demo001.domain; public class Result { private Integ ...
- idea关联数据库
时区错误解决方法
- vue的逆向传值(子传父)
逆向传值:子组件传值给父组件叫做逆向传值 (是不v欸允许的,必须经过事件触发才能传值) 逆向传值步骤: 1.要传值必须先抛出,在接收 语法: this.$emit("event" ...