ClickHouse(七):Clickhouse数据类型-2

 

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容!

🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,Kerberos安全认证,大数据OLAP体系技术栈-CSDN博客

📌订阅:拥抱独家专题,你的订阅将点燃我的创作热情!

👍点赞:赞同优秀创作,你的点赞是对我创作最大的认可!

⭐️ 收藏:收藏原创博文,让我们一起打造IT界的荣耀与辉煌!

✏️评论:留下心声墨迹,你的评论将是我努力改进的方向!

目录

11. 枚举类型 Enum

​​​​​​​12. Nullable

​​​​​​​13. 数组类型 Array(T)

​​​​​​​14. Tuple类型

​​​​​​​15. 嵌套类型Nested

​​​​​​​16. Domain


​​​​​​​11. 枚举类型 Enum

枚举类型通常在定义常量时使用,ClickHouse提供了Enum8和Enum16两种枚举类型。Enum保存'string'=integer的对应关系。在 ClickHouse 中,尽管用户使用的是字符串常量,但所有含有 Enum 数据类型的操作都是按照包含整数的值来执行。这在性能方面比使用 String 数据类型更有效。

Enum8和Enum16分别对应'String'=Int8和'String'=Int16,Enum8类型的每个值范围是-128 ... 127,Enum16类型的每个值范围是-32768 ... 32767,所有的字符串或者数字都必须是不一样的,允许存在空字符串,Enum类型中数字可以是任意顺序,顺序并不重要。

向Enum字段中插入值时,可以插入枚举的字符串值也可以插入枚举对应的Int值,建议插入对应的字符串值,这样避免插入对应的Int值不在Enum枚举集合中再次查询表时报错。定义了枚举类型值之后,不能写入其他值的数据,写入的值不在枚举集合中就会抛出异常。

  • 示例:
#创建一个表,带有Enum类型的列node1 :) CREATE TABLE t_enum(x Enum8('hello' = 1, 'world' = 2)) ENGINE = TinyLog#向表中插入数据node1 :) insert into t_enum values('hello'),(2);#查询结果node1 :) select * from t_enum;SELECT *FROM t_enum┌─x─────┐│ hello ││ world │└───────┘2 rows in set. Elapsed: 0.003 sec.#插入不在枚举集合中的值时,抛出异常node1 :) insert into t_enum values ('aa')INSERT INTO t_enum VALUESException on client:Code: 36. DB::Exception: Unknown element 'aa' for type Enum8('hello' = 1, 'world' = 2)Connecting to database mydb at localhost:9000 as user default.Connected to ClickHouse server version 20.8.3 revision 54438.#使用枚举类型代替boolean类型。建表,并插入数据node1 :) CREATE TABLE t_enum2(bl Enum8('true' = 1, 'false' = 0)) ENGINE = TinyLog;node1 :) insert into t_enum2 values(0),(1);node1 :) select * from t_enum2;SELECT *FROM t_enum2┌─bl────┐│ false ││ true  │└───────┘2 rows in set. Elapsed: 0.004 sec.#查询时可以通过函数将对应的Enum底层数值获取出来node1 :) select toInt8(bl) from t_enum2;SELECT toInt8(bl)FROM t_enum2┌─toInt8(bl)─┐│          0 ││          1 │└────────────┘2 rows in set. Elapsed: 0.004 sec.

​​​​​​​12. Nullable

Nullable类型只能与基础数据类型搭配使用,表示某个类型的值可以为NULL,Nullable(Int8)表示可以存储Int8类型的值,没有值时存NULL。使用Nullable需要注意:Nullable类型的字段不能作为索引字段,尽量避免使用Nullable类型,因为字段被定义为Nullable类型后会额外生成[Column].null.bin文件保存Null值,增加开销,比普通列消耗更多的存储空间。

  • 示例:
#创建表,含有Nullable类型的列node1 :) CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLog;#向表 t_null中插入数据node1 :) INSERT INTO t_null VALUES (1, NULL), (2, 3);#查询表t_null中的数据node1 :) select * from t_null;SELECT *FROM t_null┌─x─┬────y─┐│ 1 │ ᴺᵁᴸᴸ ││ 2 │    3  │└───┴──────┘2 rows in set. Elapsed: 0.007 sec#查询表t_null做简单运算node1 :) SELECT x + y FROM t_null;SELECT x + yFROM t_null┌─plus(x, y)─┐│       ᴺᵁᴸᴸ   ││          5   │└────────────┘2 rows in set. Elapsed: 0.004 sec.

​​​​​​​13. 数组类型 Array(T)

Array(T),由 T 类型元素组成的数组。T 可以是任意类型,包含数组类型。但不推荐使用多维数组,ClickHouse对多维数组的支持有限。例如,不能在MergeTree表中存储多维数组。

数组的定义方式有两种:Array(T),[1,2,3... ...],数组类型里面的元素必须具有相同的数据类型,否则会报异常。另外,需要注意的是,数组元素中如果存在Null值,则元素类型将变为Nullable。

从数组中查询获取值使用 xx[1|2.. ...],直接使用中括号获取值,下标从1开始。

  • 示例:
#两种方式定义数组node1 :) SELECT array(1, 2) AS x, toTypeName(x),['zs','ls','ww'] as y ,toTypeName(y)SELECT[1, 2] AS x,toTypeName(x),['zs', 'ls', 'ww'] AS y,toTypeName(y)┌─x─────┬─toTypeName(array(1, 2))─┬─y────────────────┬─toTypeName(['zs', 'ls', 'ww'])─┐│ [1,2] │ Array(UInt8)            │ ['zs','ls','ww'] │ Array(String)                  │└───────┴─────────────────────────┴──────────────────┴────────────────────────────────┘1 rows in set. Elapsed: 0.004 sec.# 数组中有Null,则数组类型为Nullablenode1 :) SELECT array(1, 2, NULL) AS x, toTypeName(x);SELECT[1, 2, NULL] AS x,toTypeName(x)┌─x──────────┬─toTypeName(array(1, 2, NULL))─┐│ [1,2,NULL] │ Array(Nullable(UInt8))        │└────────────┴───────────────────────────────┘1 rows in set. Elapsed: 0.006 sec.#数组类型里面的元素必须具有相同的数据类型,否则会报异常node1 :) SELECT array(1, 'a')SELECT [1, 'a']Received exception from server (version 20.8.3):Code: 386. DB::Exception: Received from localhost:9000. DB::Exception: There is no supertype for types UInt8, String because some of them are String/FixedString and some of them are not.0 rows in set. Elapsed: 0.005 sec.#创建表,含有array(T)类型字段,并插入数据node1 :) create table t_array(id UInt32,name String,score Array(UInt32)) ENGINE = TinyLog;#插入数据,注意:字符串在clickhouse中只能是单引号node1 :) insert into t_array values (1,'zs',array(10,20,30)),(2,'ls',[100,200,300])#数组内获取值node1 :) select id,name,score[1] from t_array;SELECTid,name,score[1]FROM t_array┌─id─┬─name─┬─arrayElement(score, 1)─┐│  1  │ zs      │                     10       ││  2  │ ls      │                    100      │└──┴─── ─┴───────────────┘5 rows in set. Elapsed: 0.004 sec.

​​​​​​​14. Tuple类型

元组类型有1~n个元素组成,每个元素允许设置不同的数据类型,且彼此之间不要求兼容。与数组类似,元组也可以使用两种方式定义:tuple(1,'hello',12.34)或者直接写(1,'hello',45.67),元组中可以存储多种数据类型,但是要注意数据类型的顺序。

  • 示例:
#创建元组node1 :) SELECT tuple(1,'a') AS x, toTypeName(x),(1,'b','hello') AS y ,toTypeName(y)SELECT(1, 'a') AS x,toTypeName(x),(1, 'b', 'hello') AS y,toTypeName(y)┌─x───────┬─toTypeName(tuple(1, 'a'))─┬─y───────────────┬─toTypeName(tuple(1, 'b', 'hello'))─┐│ (1,'a') │ Tuple(UInt8, String)      │ (1,'b','hello') │ Tuple(UInt8, String, String)       │└─────────┴───────────────────────────┴─────────────────┴────────────────────────────────────┘1 rows in set. Elapsed: 0.004 sec.#建表,含有元组类型node1 :) create table t_tuple(id UInt8,name String,info Tuple(String,UInt8)) engine = TinyLog#插入数据node1 :) insert into t_tuple values (1,'zs',tuple('cls1',100)),(2,'ls',('cls2',200))#查询数据node1 :) select * from t_tuple;SELECT *FROM t_tuple┌─id─┬─name─┬─info─────────┐│  1 │ zs   │ ('cls1',100) ││  2 │ ls   │ ('cls2',200) │└────┴──────┴──────────────┘2 rows in set. Elapsed: 0.003 sec.

​​​​​​​15. 嵌套类型Nested

ClickHouse支持嵌套数据类型(Nested),可以为一个表定义一个或者多个嵌套数据类型字段,但是每个嵌套字段只支持一级嵌套,即嵌套字段内不能继续使用嵌套类型。嵌套一般用来表示简单的级联关系,嵌套本质上是一个多维数组,嵌套类型中的每个数组的长度必须相同。目前,Nested类型支持很局限,MergeTree引擎中不支持Nested类型。

  • 示例:
#创建一个表,每个人可以属于多个部门,在不同部门有不同的编号idnode1 :) create table t_nested(:-]            id UInt8,:-]            name String,:-]            dept Nested(:-]               id UInt8,:-]               name String:-]       )) engine = TinyLog;#查看表t_nested的表结构node1 :) desc t_nested;DESCRIBE TABLE t_nested┌─name──────┬─type──────────┬│ id          │ UInt8           ││ name        │ String         ││ dept.id    │ Array(UInt8)  ││ dept.name │ Array(String) │└───────────┴───────────────┴4 rows in set. Elapsed: 0.003 sec.#向表t_nested中插入数据node1 :) insert into t_nested values (1,'zs',[10,11,12],['dp1','dp2','dp3']),(2,'ls',[100,101],['dp4','dp5'])#查询表 t_nested数据,可以获取嵌套类型中部分字段node1 :) select *,dept.name[1] as first_dpt from t_nested;SELECT*,dept.name[1] AS first_dptFROM t_nested┌─id─┬─name─┬─dept.id────┬─dept.name───────────┬─first_dpt─┐│  1 │ zs   │ [10,11,12] │ ['dp1','dp2','dp3'] │ dp1       ││  2 │ ls   │ [100,101]  │ ['dp4','dp5']       │ dp4       │└────┴──────┴────────────┴─────────────────────┴───────────┘2 rows in set. Elapsed: 0.004 sec.

​​​​​​​16. Domain

Domain类型是特定实现的类型,目前支持IPv4IPv6两类,本质上他们是对整形和字符串的进一步封装,IPv4类型基于UInt32封装,IPv6基于FixedString(16)封装。

出于便捷性的考量,例如:IPv4类型支持格式检查,格式错误的IP无法被写入。出于性能的考量,IPv4和IPv6相对于String更加紧凑,占用的空间更小,查询性能更快。

在使用Domain时需要注意,虽然表面看起来与String一样,但是Domain类型并不是字符串,也不支持隐式自动转换成字符串,如果需要返回IP的字符串形式,需要调用函数IPv4NumToString()和IPv6NumToString()显式实现。

  • 示例:(示例以IPv4为例,IPv6同理)
#创建表 t_domain 含有IPv4字段node1 :) CREATE TABLE t_domain(url String, from IPv4) ENGINE = TinyLog;#插入数据node1 :) INSERT INTO t_domain(url, from) VALUES ('https://wikipedia.org', '116.253.40.133')('https://clickhouse.tech', '183.247.232.58')('https://clickhouse.tech/docs/en/', '116.106.34.242');#查看表 t_domain结果数据node1 :) select * from t_domain;SELECT *FROM t_domain┌─url──────────────────────────────┬───────────from─┐│ https://wikipedia.org               │ 116.253.40.133 ││ https://clickhouse.tech             │ 183.247.232.58 ││ https://clickhouse.tech/docs/en/  │ 116.106.34.242 │└───────────────────────────────────┴────────────────┘3 rows in set. Elapsed: 0.004 sec.#插入数据不符合IP格式会报错node1 :) INSERT INTO t_domain(url, from) VALUES ('https://www.baidu.com', '116.253.40')INSERT INTO t_domain (url, from) VALUESException on client:Code: 441. DB::Exception: Invalid IPv4 value.Connecting to database mydb at localhost:9000 as user default.Connected to ClickHouse server version 20.8.3 revision 54438.#将表 t_domain 中from IPv4类型转换成String类型node1 :) SELECT from,toTypeName(from) as tp1,toTypeName(s) as tp2, IPv4NumToString(from) as s FROM t_domain;SELECTfrom,toTypeName(from) AS tp1,toTypeName(s) AS tp2,IPv4NumToString(from) AS sFROM t_domain┌───────────from─┬─tp1──┬─tp2────┬─s──────────────┐│ 116.253.40.133 │ IPv4 │ String │ 116.253.40.133 ││ 183.247.232.58 │ IPv4 │ String │ 183.247.232.58 ││ 116.106.34.242 │ IPv4 │ String │ 116.106.34.242 │└────────────────┴──────┴────────┴────────────────┘3 rows in set. Elapsed: 0.003 sec.

👨‍💻如需博文中的资料请私信博主。


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openlayers渲染rgb三波段cog时达到类似rgba的效果(去掉黑底)

图是arcgis渲染成rgb的,由于没有透明度波段,底下是黑的。 为了能在前端显示透明效果,之前是用python处理数据,给它加个透明度波段 后来研究了一下ol的样式表达式,可以直接在前端去掉黑底 样式设置代码如下 const s…

Socks IP轮换:为什么是数据挖掘和Web爬取的最佳选择?

在数据挖掘和Web爬取的过程中,IP轮换是一个非常重要的概念。数据挖掘和Web爬取需要从多个网站或来源获取数据,而这些网站通常会对来自同一IP地址的请求进行限制或封锁。为了避免这些问题,数据挖掘和Web爬取过程中需要使用Socks IP轮换技术。在…

云原生势不可挡,如何跳离云原生深水区?

云原生是云计算领域一大热词,伴随云原生概念而来的是数字产业迎来井喷、数字变革来临、数字化得以破局以及新一波的技术红利等等。云原生即“云”原生,顾名思义是让“应用”最大程度地利用云的能力,发挥云价值的最佳路径。具体来说&#xff0…

Eureka增加账号密码认证登录

一、业务背景 注册中心Eureka在微服务开发中经常使用到,用来管理发布的微服务,供前端或者外部调用。但是如果放到生产环境,我们直接通过URL访问的话,这显然是不安全的。 所以需要给注册中心加上登录认证。 通过账号和密码认证进行…

【机器学习】西瓜书习题3.5Python编程实现线性判别分析,并给出西瓜数据集 3.0α上的结果

参考代码 结合自己的理解,添加注释。 代码 导入相关的库 import numpy as np import pandas as pd import matplotlib from matplotlib import pyplot as plt导入数据,进行数据处理和特征工程 得到数据集 D { ( x i , y i ) } i 1 m , y i ∈ { 0 ,…

小程序商品如何设置限购

限购是一种常用的小程序商品销售策略,可以帮助商家提高销售额、控制库存和增加用户的购买欲望。那么,小程序产品怎么设置限购呢?下面将为您详细介绍。 1. 设置限购数量 可以设置最低购买数量来鼓励用户批量购买或满足特定的销售需求。例如&…

FFmpeg常见命令行(一):FFmpeg工具使用基础

前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个, 对应的要学习的内容是:FFmpe…

沙箱逃逸复现

当this指向window 原理 1.this直接指向window,拿到window的tostring的constructor来利用构造函数拿到process 是对象且指向沙箱外部,才可以利用 const vm require(vm); const script const process this.toString.constructor(return process)() pr…

OpenCL编程指南-9.1命令、队列、事件

概述 命令队列是OpenCL的核心。平台定义了一个上下文,其中包含一个或多个计算设备。每个计算设备可以有一个或多个命令队列。提交到这些队列的命令将完成OpenCL程序的具体工作。 在一个简单的OpenCL程序中,提交到一个命令队列的命令会按顺序执行。一个…

面试热题100(二叉树的右视图)

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 树这类问题用的最多的就是递归,因为树具有天然的递归结构: 我们来分析一下题目,给定一棵树根结…

vue拖拽改变宽度

1.封装组件ResizeBox.vue <template><div ref"resize" class"resize"><div ref"resizeHandle" class"handle-resize" /><slot /></div> </template> <script> export default {name: Resi…

Python入门自学进阶-Web框架——38、redis、rabbitmq、git

缓存数据库redis&#xff1a; NoSQL&#xff08;Not only SQL&#xff09;泛指非关系型的数据库。为了解决大规模数据集合多重数据类的挑战。 NoSQL数据库的四大分类&#xff1a; 键值&#xff08;Key-Value&#xff09;存储数据库列存储数据库文档型数据库图形&#xff08;…

Spring学习笔记之spring概述

文章目录 Spring介绍Spring8大模块Spring特点 Spring介绍 Spring是一个轻量级的控制反转和面向切面的容器框架 Spring最初的出现是为了解决EJB臃肿的设计&#xff0c;以及难以测试等问题。 Spring为了简化开发而生&#xff0c;让程序员只需关注核心业务的实现&#xff0c;尽…

【暑期每日一练】 day14

目录 选择题 &#xff08;1&#xff09; 解析&#xff1a; &#xff08;2&#xff09; 解析&#xff1a; &#xff08;3&#xff09; 解析&#xff1a; &#xff08;4&#xff09; 解析&#xff1a; &#xff08;5&#xff09; 解析&#xff1a; 编程题 题一 …

品牌活动 | 阿里云云原生技术实践营:大模型+CloudOS,实现企业智能化

近日&#xff0c;由阿里云举办的“云原生技术实践营-应用和容器实践专场”在广州顺利开展。行云创新CEO马洪喜作为受邀嘉宾之一&#xff0c;参加了本次活动&#xff0c;分享了主题为“API大语言模型&#xff0c;以非侵入式实现企业业务智能化变革”的演讲&#xff0c;向参会者展…

Java正则校验密码至少包含:字母数字特殊符号中的2种

一、语法 字符说明\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如&#xff0c; n匹配字符 n。\n 匹配换行符。序列 \\\\ 匹配 \\ &#xff0c;\\( 匹配 (。^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性&#xff0c;^ 还会与"\n…

【计算机网络】网络层协议 -- ICMP协议

文章目录 1. ICMP协议简介2. ICMP协议格式3. ping命令4. ping命令与端口号没有关系&#xff01;&#xff01;&#xff01;5. traceroute命令 1. ICMP协议简介 ICMP&#xff08;Internet Control Message Protocol&#xff0c;控制报文协议&#xff09;&#xff0c;用于在IP主机…

web前端转正工作总结范文5篇

web前端转正工作总结&#xff08;篇1&#xff09; 来到__有限公司已经三个月了&#xff0c;目前的工作是前端开发&#xff0c;我是一名应届毕业生&#xff0c;之前没有过工作经验&#xff0c;在刚来到__这个大家庭的时候&#xff0c;我就被这里的工作气氛深深地吸引&#xff0…

C# Onnx Paddle模型 OCR识别

RapidOCR https://github.com/RapidAI/RapidOCR/blob/main/docs/README_zh.md 效果 项目 Demo&#xff08;带模型&#xff09;下载

【积水成渊】CSS磨砂玻璃效果和渐变主题色文字

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcyllqj/category_12346639.html?spm1…