背景
安装好ClickHouse后,我们从其数据类型开始学习
整型
整型类型、是否有符号和取值范围如下表所示:
其中有符号整型取值范围为[-2^n-1, 2^(n-1)-1],无符号整型取值范围为[0, 2^(n-1)],n取值范围为{8, 16, 32 ,64}
浮点型
Float32和Float64
布尔型
无,可用整型表示
精度保持浮点数
有Decima32(n)、Decimal64(n)和Decimal128(n)三种类型,最大位数分别为9、18和38,其中n表示小数部分位数。
比如用这三种类型表示123321.1234567,Decimal32(3)、Decimal64(3)和Decimal128(3)就都是123321.123。
字符串
可变长度字符串String和固定长度为N的字符串FixedString(N),前者长度任意,后者长度固定为N(可传入),不够则在末尾加入空字节,超出则报错。
枚举类型
有Enum8和Enum16两种类型,用以保存字符串和8位或16位有符号整数的的对应关系。
比如创建一个a对应1,b对应2的表,其中x列存有枚举类型:
scentos :) create table t_enum (x Enum8('a'=1, 'b'=2)) engine = TinyLog;
其中的x列只能存储枚举类型中列举的字符串:
scentos :) insert into t_enum values ('a'), ('b'), ('b');
如果存其他没有枚举出来的字符串,就会抛出异常:
scentos :) insert into t_enum values ('ac');
INSERT INTO t_enum FORMAT Values
Query id: f9fddc87-f21a-4c63-a6e8-2d0510e00961
Exception on client:
Code: 36. DB::Exception: Unknown element 'ac' for enum: While executing ValuesBlockInputFormat: data for INSERT was parsed from query. (BAD_ARGUMENTS)
scentos :)
如果要看到某个枚举列对应的数值,必须将其值转换成定义时对应的整数类型:
scentos :) select cast(x, 'Int8') from t_enum;
SELECT cast(x, 'Int8')
FROM t_enum
Query id: 4690987b-fe53-4e37-b437-4a57f8790377
Connecting to database default at localhost:9000 as user default.
Connected to ClickHouse server version 21.11.5 revision 54450.
┌─CAST(x, 'Int8')─┐
│ 1 │
│ 2 │
│ 2 │
└─────────────────┘
3 rows in set. Elapsed: 0.003 sec.
scentos :)
时间类型
有三种时间类型,如下表所示:
数组类型
Array(T):由类型T组成的数组,T可以是任何类型,包括数组类型,但不推荐存储多维数组。
创建数组可以用array函数:
scentos :) select array(1, -2) as x, toTypeName(x);
SELECT
[1, -2] AS x,
toTypeName(x)
Query id: 043c2e1e-1b12-4c0d-bba9-9ab1513e2a73
┌─x──────┬─toTypeName(array(1, -2))─┐
│ [1,-2] │ Array(Int16) │
└────────┴──────────────────────────┘
1 rows in set. Elapsed: 0.003 sec.
也可以用中括号:
scentos :) select [1, 2] as x, toTypeName(x);
SELECT
[1, 2] AS x,
toTypeName(x)
Query id: 89c7dda8-d335-4af2-b6af-b8977dc6e686
┌─x─────┬─toTypeName([1, 2])─┐
│ [1,2] │ Array(UInt8) │
└───────┴────────────────────┘
1 rows in set. Elapsed: 0.001 sec.
更多数据类型可参见官网文档