ClickHouse中的数据类型

news2024/11/15 15:39:47

ClickHouse中的数据类型

    • 数据类型说明
    • 数值类型
      • Int
      • Float
      • Decimal
    • 字符串类型
      • String
      • FixedString
      • UUID
    • 时间类型
      • Date
      • DateTime
      • DateTIme64
    • 复杂类型
      • Array
      • Enum
      • Tuple
      • Nested
    • 特殊类型
      • IPV4
      • GEO
      • Boolean 和 Nullable

[参考文章]:

  1. ClickHouse | 数据类型介绍

数据类型说明

作为一款分析型数据库,ClickHouse提供了许多数据类型,它们可以划分为基础类型、复合类型和特殊类型

其中基础类型使ClickHouse具备了描述数据的基本能力,而另外两种类型则使ClickHouse的数据表达能力更加丰富立体

基本数据类型

MysqlHiveClickHouse(区分大小写)
byteTINYINTInt8
shortSMALLINTInt16
intINTInt32
longBIGINTInt64
varcharSTRINGString
timestampTIMESTAMPDateTime
floatFLOATFloat32
doubleDOUBLEFloat64
booleanBOOLEAN

数值类型

Int

固定长度的整型,包括有符号整型或无符号整型。

创建表时,可以为整数设置类型参数 (例如. TINYINT(8), SMALLINT(16), INT(32), BIGINT(64)), 但 ClickHouse 会忽略它们,ClickHouse使用固定长度的整型

① 整型范围

名称大小数值范围别名
Int81[-128 : 127]TINYINT, BOOL, BOOLEAN, INT1
Int162[-32768 : 32767]SMALLINT, INT2
Int324[-2147483648 : 2147483647]INT, INT4, INTEGER
Int648[-9223372036854775808 : 9223372036854775807]BIGINT
Int128-[-170141183460469231731687303715884105728 : 170141183460469231731687303715884105727]-
Int256-[-57896044618658097711785492504343953926634992332820282019728792003956564819968 : 57896044618658097711785492504343953926634992332820282019728792003956564819967]-

② 无符号整型范围(即都是正数)

名称大小数值范围别名
UInt81[0 : 255]-
UInt162[0 : 65535]-
UInt324[0 : 4294967295]-
UInt648[0 : 18446744073709551615]-
Int128-[0 : 340282366920938463463374607431768211455]-
Int256-[0 : 115792089237316195423570985008687907853269984665640564039457584007913129639935]-

Float

名称大小有效精度(位数)别名
Float3247Float
Float64816Double

注意:以下情况会出现精度问题

-- inf(正无穷)
select 7.0/0

-- inf(负无穷)
select -7.0/0

-- nan(非数字)
select 0/0

在这里插入图片描述

Decimal

如果需要高精度,ClickHouse提供了 Decimal32Decimal64Decimal128 三种精度的定点数

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

-- 简写格式
Decimal32(S)
Decimal64(S)
Decimal128(S)
名称等效声明数值范围
Decimal32(S)Decimal(1~9,S)[-1*10^(9-S) : 10^(9-S)]
Decimal64Decimal(10~18,S)[-1*10^(18-S) : 10^(9-S)]
Decimal128Decimal(19~38,S)[-1*10^(38-S) : 10^(38-S)]

注意:在使用两个不同精度的定点数进行四则运算的时候,它们的小数点位数S会发生变化

-- 在进行加法运算时,S取最大值,S=4
toDecimal64(2,4)与toDecimal32(2,2)相加后S=4

-- 在进行减法运算时,S取最大值,S=4
toDecimal64(2,4)与toDecimal32(2,2)相减后S=4

-- 在进行乘法运算时,S取最和,S=4+2
toDecimal64(2,4)与toDecimal32(2,2)相乘后S=4+2

-- 在进行除法运算时,S取最大值,S=4(但是要保证被除数的S大于除数的S,否则会报错)
toDecimal64(2,4)与toDecimal32(2,2)相除后S=4
名称规则
加法S = max(S1,S2)
减法S = max(S1,S2)
乘法S = S1 + S2(S1范围 >= S2范围)
除法S = S1 (S1为被除数, S1/S2)

字符串类型

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

从命名来看仿佛不像是由一款数据库提供的类型,反而更像是一门编程语言的设计,没错CK语法具备编程语言的特征(数据+运算)

String

字符串由String定义,长度不限,在使用String的时候无须声明大小,它完全代替了传统意义上数据库的Varchar、Text、Clob和Blob等字符类型

String类型不限定字符集,可以将任意编码的字符串存入其中

为了程序的规范性和可维护性,在同一套程序中应该遵循使用统一的编码,例如“统一保持UTF-8编码”就是一种很好的约定

FixedString

FixedString 类型和传统意义上的 Char 类型有些类似,对于一些字符有明确长度的场合,可以使用固定长度的字符串

-- FixedString 的定义格式,N表示字符串长度
FixedString(N)

注意:与 Char 不同的是,FixedString 使用 null 字节填充末尾字符,而 Char 通常使用空格填充

create table fixedstring_demo(create_date Date, mobile FixedString(11), desc String) ENGINE=TinyLog;

insert into table fixedstring_demo values(now(), '1871016', '张三');
insert into table fixedstring_demo values(now(), '18710167716111', 'lisi');

UUID

UUID 是一种数据库常见的主键类型,在ClickHouse中直接把它作为一种数据类型

注意:UUID共有32位,它的格式为 8-4-4-4-12,如果一个UUID类型的字段在写入数据时没有被赋值,则会依照格式使用0填充

CREATE TABLE UUID_TEST (c1 UUID,c2 String) ENGINE = Memory;
--第一行UUID有值 
INSERT INTO UUID_TEST SELECT generateUUIDv4(),'t1'
--第二行UUID没有值 
INSERT INTO UUID_TEST(c2) VALUES('t2')

在这里插入图片描述

时间类型

Date

Date 类型不包含具体的时间信息,只精确到天,支持字符串形式写入:

CREATE TABLE testDate(`ct` Date)ENGINE = Memory;
-- 插入数据
insert into testDate values('2020-12-26'),(now());

在这里插入图片描述

DateTime

DateTime类型包含时、分、秒信息,精确到秒,支持字符串形式写入

create table testDataTime(ctime DateTime) engine=Memory ;
insert into testDataTime values('2020-12-27 01:11:12'),(now());

在这里插入图片描述

DateTIme64

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

CREATE TABLE Datetime64_TEST(c1 Datetime64(2)) ENGINE = Memory; 
--以字符串形式写入 
INSERT INTO Datetime64_TEST VALUES('2020-06-22 00:00:00');

在这里插入图片描述

复杂类型

Array

ClickHouse 支持数组这种复合数据类型,数组中的数据类型需要一致

SELECT ['a','b','c'];

SELECT [1, 2, 3];

在这里插入图片描述

Enum

ClickHouse 支持枚举类型,这是一种在定义常量时经常会使用的数据类型

ClickHouse提供了Enum8 和Enum16两种枚举类型,它们除了取值范围不同之外,别无二致

注意:枚举固定使用 (String:Int)Key/Value 键值对的形式定义数据,所以 Enum8Enum16 分别会对应(String:Int8)(String:Int16)

create table test_enum(id Int8 , color Enum('red'=1 , 'green'=2 , 'blue'=3)) engine=Memory ;
insert into  test_enum values(1,'red'),(1,'red'),(2,'green');

在这里插入图片描述

Tuple

元组类型由 1~n 个元素组成,每个元素之间允许设置不同的数据类型,且彼此之间不要求兼容

元组同样支持类型推断,其推断依据仍然以最小存储代价为原则

注意:与数组类似,元组也可以使用两种方式定义,常规方式 tuple(T),元组中可以存储多种数据类型,但是要注意数据类型的顺序

-- 常规定义方式
select tuple(1,'asb',12.23) as x , toTypeName(x);

-- 简写形式
SELECT (1, 'zss', 12, 1);

在这里插入图片描述

注意:建表的时候需要定义元组中的数据类型

CREATE TABLE Tuple_TEST (c1 Tuple(String,Int8)) ENGINE = Memory; 

Nested

Nested是一种嵌套表结构

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

create table  test_nested(id Int8, name String,props Nested(pid Int8,pnames String,pvalues String))engine=Memory;

在这里插入图片描述

特殊类型

IPV4

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

注意:出于便捷性的考量,例如 IPv4 类型支持格式检查,格式错误的 IP 数据是无法被写入的。IPv4 相比 String 更加紧凑,占用的空间更小,查询性能更快。IPv6 类型是基于 FixedString(16) 封装的,它的使用方法与 IPv4 别无二致, 在使用 Domain 类型的时候还有一点需要注意,虽然它从表象上看起来与String一样,但Domain类型并不是字符串,所以它不支持隐式的自动类型转换。如果需要返回IP的字符串形式,则需要显式调用 IPv4NumToString或IPv6NumToString函数进行转换

create table test_domain(id Int8 ,ip IPv4)engine=Memory ;
insert  into test_domain values(1,'192.168.133.2') ;

GEO

ClickHouse 支持用于表示地理对象的数据类型

① Point 类型

SET allow_experimental_geo_types = 1;
CREATE TABLE geo_point (p Point) ENGINE = Memory();
INSERT INTO geo_point VALUES((10, 10));
SELECT p, toTypeName(p) FROM geo_point;

② Ring

CREATE TABLE geo_ring (r Ring) ENGINE = Memory();
INSERT INTO geo_ring VALUES([(0, 0), (10, 0), (10, 10), (0, 10)]);
SELECT r, toTypeName(r) FROM geo_ring;

在这里插入图片描述
③ Polygon

CREATE TABLE geo_polygon (pg Polygon) ENGINE = Memory();
INSERT INTO geo_polygon VALUES([[(20, 20), (50, 20), (50, 50), (20, 50)], [(30, 30), (50, 50), (50, 30)]]);
SELECT pg, toTypeName(pg) FROM geo_polygon;

在这里插入图片描述

Boolean 和 Nullable

ClickHouse 中没有 Boolean 类型 ,使用 10 来代表 truefalse
Nullable 某种数据类型允许为null , 或者是没有给值的情况下模式是NULL

create table test_null(id  Int8,age Int8)engine = Memory ;
create table test_null2(id  Int8,age Nullable(Int8))engine = Memory ;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/134626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker | docker安装portainer详细步骤

portainer是一款容器管理可视化界面,不想在虚拟中使用命令管理容器的小伙伴,可以选择安装portainer对容器进行管理,查看日志、启动、停止容器等非常方便。 1. 搜索portainer镜像 docker search portainer 2. 拉取portainer镜像 docker pull…

[torch]日志记录之SummaryWriter(持更)

参考博文: 《tensorboardX的简单使用》《详解PyTorch项目使用TensorboardX进行训练可视化》《使用TensorBoard检查监控深度学习模型》 一、使用方法 class SummaryWriter(builtins.object)| SummaryWriter(log_dirNone, comment, purge_stepNone, max_queue10, f…

Springboot扩展点之ApplicationContextInitializer

前言 一提到Spring、Springoboot,很多人马上就会想到依赖注入、控制反转、自动装配、约定大于配置、使开发变得简单等等。但是如果仅仅会使用Springboot、SpringMVC完成一些增删改查,解决一些bug,那么实际上你并没有真的懂Spring、Sp…

每天5分钟机器学习:线性判别分析LDA算法

本文重点 我们前面学习了PCA算法,本文我们将学习一种新的算法,这种算法和PCA非常相似,这个算法叫做线性判别分析,简称为LDA,也称为Fisher线性判别(Fisher Linear Discriminant,FLD),是模式识别的经典算法,在1996年由Belhumeur引入模式识别和人工智能领域。 LDA原理 …

毒鸡汤 | 云服务器部署项目

文章目录前言环境介绍安装PHP安装Apache安装MySQL上传项目访问网站前言 新年的第一篇文章,今年继续努力加油,继续产出高质量的文章。 前面用PHPstudy搭建了【毒鸡汤】项目,但是这样只能自己访问,别人是访问不了的,因此…

Redis 持久化机制

个人博客地址: 文章目录Redis 持久化机制1. 概述2. RDB2.1 手动快照2.2 自动快照3. AOF3.1 AOF机制3.2 AOF文件的重写4. 混合型持久化5. 总结Redis 持久化机制 1. 概述 Redis​为了保证性能,会将所有数据放在内存中,那么万一Redis宕机&…

AcWing 756. 蛇形矩阵

目录问题描述思路与代码1. 个人解法2. 官方题解问题描述 原题链接🔗:756. 蛇形矩阵 输入两个整数 nnn 和 mmm,输出一个 nnn 行 mmm 列的矩阵,将数字 111 到 nmnmnm 按照回字蛇形填充至矩阵中。 具体矩阵形式可参考样例。 输入格…

synchronized底层原理

synchronized是JVM内置锁,基于monitor机制实现,依赖底层操作系统的互斥源语Mutex(互斥量),它是一个重量级锁,性能较低。 当然,JVM内置锁在1.5之后版本做了重大优化,如锁粗化&#xf…

[红明谷CTF 2021]JavaWeb

0x01 好久没打过ctf了,最近也在学Java 就看下java的题吧 WP 进入环境就提示访问 /login ,访问之后 提示的 /json ,试着访问一下 给了 jessid,继续访问 /json 的话 又会跳转至 /login 应该是要传点username password 果然是了&#…

web制作网页

HTML(人的骨架): 标签 1.超文本标记性语言 2.当前最新版HTML5 3.URL统一资源定位器(网址) 4.网站首页名称index.html,default.htm,main.heml 基本结构: 注意:1.标签都是小写 2.标签成对写 3.代码要层次缩进…

JavaScript内存管理

JavaScript 是一个弱类型的、动态语言,在执行一段 JS 代码时,需要经历编译、执行、内存回收阶段。 一、编译阶段 JS 代码执行时,会首先创建全局执行上下文、以及函数执行上下文,上下文的执行顺序按照栈的方式进行调用&#xff0c…

面试题: JVM内存结构

目录目的资源概览JVM内存溢出分类类型1: OutOfMemoryError类型2: StackOverflowError方法区与永久代、元空间之间的关系目的 学习记录, 面试准备 资源 B站的一个讲高频面试题的一个学习视频 概览 线程私有 ① 程序计数器 ② 虚拟机栈线程共享 ① 堆 ② 方法区 JVM内存溢…

RSA密钥协商过程

目录 TSL握手过程 RSA密钥协商握手过程 TLS第一次握手 TLS第二次握手 客户端验证证书 TLS第三次握手 TLS 第四次握手 RSA 算法的缺陷 TSL握手过程 HTTP 由于是明文传输,所谓的明文,就是说客户端与服务端通信的信息都是肉眼可见的,随…

linux常用指令讲解

文章目录 前言一、指令详解总结前言 Linux是一种自由和开放源代码的类UNIX操作系统,该操作系统的内核由林纳斯托瓦兹在1991年首次发布,之后,在加上用户空间的应用程序之后,就成为了Linux操作系统。严格来讲,Linux只是操…

分布式锁的实现

目录分布式锁分布式锁的引出单体锁存在的问题分布式锁的引出分布式锁的设计思路分布式锁的常见应用场景分布式锁方案分布式锁 分布式锁的引出 单体锁存在的问题 在单体应用中,如果我们对共享数据不进行加锁操作,多线程操作共享数据时会出现数据一致性问…

【Kuangbin简单DP】平整数组

4562. 平整数组 - AcWing题库 题意&#xff1a; 思路&#xff1a; 一开始想的是 设DP状态是&#xff1a;dp[i][0/1]表示阶段到 i &#xff0c;然后前面是递增or递减的最小sum的集合 然后我是怎么转移的呢&#xff0c;现在看来感觉挺好笑的&#xff1a; #include <bits/…

Golang 函数使用的注意事项和细节

来自&#xff1a;尚硅谷-韩老师 尚硅谷 1&#xff09;函数的形参列表可以是多个&#xff0c;返回值列表也可以是多个 2&#xff09;形参列表和返回值列表的数据类型可以是值类型和引用类型 3&#xff09;函数的命名遵循标识符命名规范&#xff0c;首字母不能是数字&#xf…

京东购物成功订单已开具个人发票不能报销怎么申请更换重新开具企业发票用于报销?

原文来源&#xff1a;https://www.caochai.com/article-4109.html 京东购物订单的发票开成个人了可以更换成企业发票吗&#xff1f; 可以&#xff0c;通过京东购物完成的订单默认开个人发票&#xff0c;如果对发票有要求需要开企业发票的可以申请更换重新开企业发票&#xff1…

一文读懂JVM虚拟机:JVM虚拟机的内存管理(万字详解)

JVM虚拟机的内存管理 文章目录JVM虚拟机的内存管理JVM与操作系统Java虚拟机规范和 Java 语言规范的关系java虚拟机的内存管理JVM整体架构一、PC 程序计数器二、虚拟机栈三、本地方法栈四、堆Java 堆概念年轻代和老年代对象分配过程堆GC元空间为什么要废弃永久代&#xff0c;引入…

动手学习深度学习-《矩阵运算》

标量导数 常用求导&#xff1a; yyyaaaxnx^nxnexp(x)exp(x)exp(x)log(x)log(x)log(x)sin(x)sin(x)sin(x)dydx\frac{dy}{dx}dxdy​000nxn−1nx^{n-1}nxn−1exp(x)1x\frac{1}{x}x1​cos(x)cos(x)cos(x) 求导公式&#xff1a; yyyuvuvuvuvuvuvyf(u),ug(x)yf(u),ug(x)yf(u),ug(x)d…