数据类型

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进行存储的,所以不支持隐式的自动类型转换