clickhouse -- 二、数据定义
数据类型
clickhouse的数据类型可以划分为基础数据类型、复合数据类型和特殊数据类型
基础数据类型
数值、字符串和时间
数值
int
| 名称 | 大小 | 数值 | 普遍称呼 |
|---|---|---|---|
| int8 | 1 | -128~127 | tinyint |
| int16 | 2 | -32768~32767 | smallint |
| int32 | 4 | … | int |
| int64 | 8 | … | bigint |
ch在这个地方还是比较直,int加上多少位进行命名,同MySQL一样,也支持无符号整数
| 名称 | 大小 | 数值 | 普遍称呼 |
|---|---|---|---|
| uint8 | 1 | 0~255 | tinyint |
| uint16 | 2 | 0~65535 | smallint |
| uint32 | 4 | … | int |
| uint64 | 8 | … | bigint |
float
ch中有float32和float64来表示单精度和双精度浮点数
| 名称 | 大小 | 精度 | 普遍称呼 |
|---|---|---|---|
| float32 | 4 | 7 | float |
| float64 | 8 | 16 | double |
同时浮点数还支持正无穷select 8/0和负无穷select -8/0以及非数字select 0/0
decimal
高精度计算,暂时没有接触过,以后用到再说
字符串类型
string
长度不限,也就说不用声明大小,也不需要设置字符集,可以存储任意编码的字符串,实际使用的时候同一套系统中最好还是相同的编码
FixedString
类似于char,只是char用空格进行补齐,FixedString使用null进行补齐
UUID
数据库中常见的主键类型,ch中直接作为一种数据类型,如果没有被赋值,会使用0按格式进行填充
时间类型
DateTime
包含时分秒信息,精度是秒,支持使用字符串形式写入
date
精度是天,同样支持字符串格式写入
DateTime64
这里没讲,遇到再查
复合类型
数组、元组、枚举和嵌套
Array
CREATE TABLE Array_TEST (
c1 Array(String)
) engine = Memory ;
数组定义的时候需要指定元素的类型
tuple
CREATE TABLE Tuple_TEST(
c1 Tuple(String,Int8)
) ENGINE = Memory;
同样需要指定类型,不过元素间类型可以不同
enum
CREATE TABLE Enum_TEST (
c1 Enum8('ready' = 1,'start' = 2,'success' = 3,'error' = 4)
) ENGINE = Memory;
<!--插入数据-->
INSERT INTO Enum_TEST VALUES('ready');
INSERT INTO Enum_TEST VALUES('start');
InnoDB中反正是不推荐大家用枚举的,ch情况如何还不清楚;只是说性能比直接使用string要高,因为对枚举的操作都使用int类型的值进行
nested
CREATE TABLE nested_test (
name String,
age UInt8,
dept Nested(
id UInt8,
name String
)
) ENGINE = Memory;
员工和部门这样的结构可以使用嵌套,ch中只支持一层嵌套
特殊类型
Nullable
并不是一中独立的数据类型,是一个辅助修饰符
CREATE TABLE Null_TEST (
c1 String,
c2 Nullable(UInt8)
) ENGINE = TinyLog;
表示取值可以为空,只能和基础类型搭配使用
domain
分为IPv4和IPv6两类,是对字符串和整型的进一步封装
CREATE TABLE IP4_TEST (
url String,
ip IPv4
) ENGINE = Memory;
INSERT INTO IP4_TEST VALUES('www.nauu.com','192.0.0.0');
IPv4类型支持格式检查,格式错误的数据无法被写入,IPv4使用Uint32进行存储,相比String更加紧凑,占用空间更小,性能更高;需要注意的是,由于并不是按string进行存储的,所以不支持隐式的自动类型转换
