Clickhouse — 数据定义
文章目录
- Clickhouse --- 数据定义
- 1. 简介
- 2. 数据定义
- 2.1 基础类型
- 2.2 复合类型
- 2.3 特殊类型
1. 简介
Clickhouse 是一款服务于Yandex.Metrica的产品。Metrica 是一款用于web流量分析工具,对采集的数据进行数据分析(OLAP的分析)。因此,ClickHouse是一款OLAP数据库。
这里主要介绍其数据定义的几种方式。
2. 数据定义
作为一款完整的数据库管理系统(DBMS),Clickhouse拥有完整的DDL与DML功能。在支持大量的SQL的条件下,Clickhouse作为一款高性能OLAP数据库,不能用传统SQL数据库来度量。
对于数据的定义方式Clickhouse分为:基础类型、复合类型和特殊类型。
2.1 基础类型
- 数值类型
- Int
首当其冲的当然是必不可少的Int类型。相比于传统的smallint、int、BigiInt,Clickhouse定义Int的方式更加易懂。具体如下表所示
名称 | 范围 | 字节大小 |
Int8 | -128~127 | 1 |
Int16 | -327678~32767 | 2 |
Int32 | -2147483648~2147483647 | 4 |
Int64 | -2^63 ~ 2^63-1 | 8 |
同时也支持无符号Int类型
名称 | 范围 | 字节大小 |
UInt8 | 0 ~ 2^8 - 1 | 1 |
UInt16 | 0 ~ 2^16 - 1 | 2 |
UInt32 | 0 ~ 2^32 - 1 | 4 |
UInt64 | 0 ~ 2^64-1 | 8 |
- Float
名称 | 大小 | 有效精度 |
Float32 | 4 | 7 |
Float62 | 8 | 16 |
Clickhouse 还支持无穷大的表达方式:inf,-inf,nan
3)Decimal
对于的更高精度的数值运算,还提供了定点数。
Decimal(P,S)
- P 代表精度,决定总位数
- S 代表规模,决定小数位大小
- 字符串类型
- String类型
长度不限制
- FixedString
通过FixedString(N)来指定大大小。
- UUID
一共有32位,格式为8-4-4-4-12
- 时间类型
CREATE TABLE Datatime_Test (
c1 DateTime,
c2 DateTime(2),
c3 Date
) ENGINE = Memory
- DateTime
DateTime 包含时、分、秒信息,精确到秒。
INSERT INTO Datatime_TEST VALUES('2021-06-20 00:00:00')
- DateTime64
这个跟上面的DateTime的区别为:可以记录亚秒,精度更高。
INSERT INTO Datatime_TEST VALUES('2021-06-20 00:00:00')
SELECT toTypeName(c2) FROM Datatime_TEST
# Output: 2020-06-20 00:00:00.00
- Date
这个精确度最低,只能精确到日期
INSERT INTO Datatime_TEST VALUES('2021-06-20')
2.2 复合类型
除了基本数据类型以外,还有数组、元组、枚举、嵌套四类复合类型。
注意:这些类型是其他数据库所不具备的
- Array
SELECT array(1,2) as a
或者
SELECT [1,2]
一个数组可以包含多种数据类型,但是数据类型之间必须兼容。比如:[1,2.0]
- Tuple
元组类型由1~n个元素组成,每个元素可以设置不同的数据类型,但是类型之间不要求兼容。
CREATE TABLE Tuple_TEST (
t1 Tuple(String, Int8)
)ENGINE = memory
INSERT INTO Tuple_TEST VALUES(('abc',123));
- Enum
固定使用(String)Key:Value
的形式
CREATE TABLE Enum_TEST (
t1 Enum8('ready' = 1, 'start' = 2, 'success' = 3)
)ENGINE = memory
INSERT INTO Enum_TEST VALUES('stop');
- Nested
对于嵌套表结构来说,可以存放多个数据类型,但是嵌套表内不能在进行套娃!
CREATE TABLE nested_TEST (
name String,
age Uint8,
dept Nested(
id Uint8,
name String
)
)ENGINE = memory
INSERT INTO nested_TEST VALUES ('nauu', 18, [1000,2000], ['研发中心','Research'])
2.3 特殊类型
- Nullable
类似于JAVA的Optional
- Domain
域名类型分为IPV4
与IPV6
问题来了:为什么要用这么复杂的结构,String直接搞定不就行了嘛?
这边主要两个理由:
IPV4
支持格式合法性检测,使得瞎写的IP无法进入- 性能更加高,
IPV4
使用UInt32存储,相比String更加紧实。
IPV6
使用FixString(16)
封装。
INSERT INTO IP4_TEST VALUES('www.nuaa.com','192.0.0') # error
INSERT INTO IP_TEST VALUES('www.nuaa.com','192.0.0.1')