数据定义

 

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. Manjaro安装Mariadb

    Mariadb是MySQL的一个复刻.由于MySQL被Oracle公司收购,MySQL的一些原始开发者担心MySQL会有开源方面的某些隐患,故领导开发了Mariadb. 如今,Mariadb已经作为许 ...

  2. poi实现生成下拉选

    在我们日常开发中,经常需要使用poi操作excel文件,现在就简单介绍一下在poi中是如何生成下拉选的. 1.创建workbook 2.创建数据约束 3.设置数据的有效性 @Test public v ...

  3. 乘风破浪,遇见上一代操作系统Windows 10 - 抢鲜尝试安装新微软商店(Microsoft Store)

    背景 在微软官方文章的<十一项关于微软商店新知>中提到: 新的微软商店现在可在Windows 11上找到,我们很高兴地分享,它将在未来几个月内提供给Windows 10客户!我们将很快分享 ...

  4. Noip模拟10 2021.6.27

    T1 入阵曲 好了,又一个考试败笔题. 也就是在那个时候,小 F 学会了矩阵乘法.让两个矩阵乘几次就能算出斐波那契数, 真是奇妙无比呢. 不过, 小 F 现在可不想手算矩阵乘法--他觉得好麻烦.取而代 ...

  5. 「刷题」THUPC泛做

    刷了一下,写一下. T1. 天天爱射击 可以这样想. 我们二分一下每一块木板在什么时刻被击碎. 然后直接用主席树维护的话是\(O(nlog^2n)\)的. 会\(T\),而且是一分不给那种... 那么 ...

  6. Python课程笔记(八)

    一些简单的文件操作,学过linux的话理解感觉不会很难.课程代码 一.OS 目录方法 这个模块提供了一种方便的使用操作系统函数的方法 函数 说明 os.mkdir("path") ...

  7. 算法:N-gram语法

    一.N-gram介绍 n元语法(英语:N-gram)指文本中连续出现的n个语词.n元语法模型是基于(n - 1)阶马尔可夫链的一种概率语言模型,通过n个语词出现的概率来推断语句的结构.这一模型被广泛应 ...

  8. 『学了就忘』Linux基础 — 7、补充:安装Linxu系统时设置硬盘挂载说明

    目录 (1)新建一个/home分区 (2)再创建一个/boot分区. (3)创建一个swap分区 (4)最后剩余的空间全部分给根目录 (5)总结 上一篇在VMwar虚拟机中安装Linux操作系统中ht ...

  9. 数字在排序数组中出现的次数 牛客网 剑指Offer

    数字在排序数组中出现的次数 牛客网 剑指Offer 题目描述 统计一个数字在排序数组中出现的次数. class Solution: def GetNumberOfK(self, data, k): i ...

  10. 0x03

    指数级枚举:1到n任意选取的所有方案数: #include<bits/stdc++.h> using namespace std; int n,a[1100],vis[1100],cnt, ...