clickhouse的数据类型
数据类型
为了提高性能,较传统数据库而言,clickhouse提供了复合数据类型。 ClickHouse的Upadate和Delete是由Alter变种实现。
1 整型
整型包括有符号整型和无符号整型两种
1.1 有符号整型
| 类型 | 范围 | 字节 |
|---|---|---|
| int8 | [-128,127] | 1 |
| int16 | [-32768 : 32767] | 2 |
| int32 | [-2147483648 : 2147483647] | 3 |
| int64 | [-9223372036854775808 : 9223372036854775807] | 4 |
1.2 无符号整型
| 类型 | 范围 | 字节 |
|---|---|---|
| UInt8 | [0 : 255] | 1 |
| UInt6 | [0 : 65535] | 2 |
| UInt32 | [0 : 4294967295] | 3 |
| UInt64 | [0 : 18446744073709551615] | 4 |
2 浮点型
| 类型 | 有效精度(位数) | 字节 |
|---|---|---|
| Float32 | 7 | 4 |
| Float64 | 16 | 8 |
注意:浮点数计算存在误差,慎用
gcw1 :) select 1-0.9 ;
SELECT 1 - 0.9
┌───────minus(1, 0.9)─┐
│ 0.09999999999999998 │
└─────────────────────┘
1 rows in set. Elapsed: 0.002 sec.
gcw1 :)
3 Decimal
如果要求更高精度,可以选择Decimal类型
格式:Decimal(P,S)
P:代表精度,决定总位数(正数部分+小数部分),取值范围0-38
S:代表规模,决定小数位数,取值范围是0-P
ClickHouse对Decimal提供三种简写: Decimal32,Decimal64,Decimal128
3.1 相加、减精度取大
两数相加减,结果的精度取精度大的
gcw1 :) SELECT toDecimal32(1, 3) + toDecimal32(2, 2) ;
SELECT toDecimal32(1, 3) + toDecimal32(2, 2)
┌─plus(toDecimal32(1, 3), toDecimal32(2, 2))─┐
│ 3.000 │
└────────────────────────────────────────────┘
3.2 相乘精度取和
gcw1 :) SELECT toDecimal32(1, 3) * toDecimal32(2, 2) ;
SELECT toDecimal32(1, 3) * toDecimal32(2, 2)
┌─multiply(toDecimal32(1, 3), toDecimal32(2, 2))─┐
│ 2.00000 │
└────────────────────────────────────────────────┘
3.3 相除精度取被除数
gcw1 :) SELECT toDecimal32(1, 3) / toDecimal32(2, 2) ;
SELECT toDecimal32(1, 3) / toDecimal32(2, 2)
┌─divide(toDecimal32(1, 3), toDecimal32(2, 2))─┐
│ 0.500 │
└──────────────────────────────────────────────┘
4 字符串
String 字符串可以任意长度的
它可以包含任意的字节集,包含空字节。
FixedString(N) 固定长度 N 的字符串,N 必须是严格的正自然数。
当服务端读取长度小于 N 的字符串时候,通过在字符串末尾添加 空字节来达到 N 字节长度。
当服务端读取长度大于 N 的字符串时候,将返回错误消息。
gcw1 :) SELECT toFixedString('zzzz', 5),LENGTH(toFixedString('zzzz', 5)) AS LENGTH;
SELECT
toFixedString('zzzz', 5),
LENGTH(toFixedString('zzzz', 5)) AS LENGTH
┌─toFixedString('zzzz', 5)─┬─LENGTH─┐
│ zzzz │ 5 │
└──────────────────────────┴────────┘
5 UUID
ClickHouse将UUID这种在传统数据库中充当主键的类型直接做成了数据类型
CREATE TABLE UUID_TEST
(
`s1` UUID,
`s2` String
)
ENGINE = TinyLog;
insert into UUID_TEST select generateUUIDv4(),'s1';
insert into UUID_TEST(s2)values('s2');
查询显示,自动补充0
gcw1 :) select * from UUID_TEST;
SELECT *
FROM UUID_TEST
┌───────────────────────────────────s1─┬─s2─┐
│ 7da9a8b3-e655-4218-aac3-e66ed758e094 │ s1 │
│ 00000000-0000-0000-0000-000000000000 │ s2 │
└──────────────────────────────────────┴────┘
6 枚举类型
包括 Enum8 和 Enum16 类型。Enum 保存 'string'= integer 的对应关系。
Enum8 用 'String'= Int8 对描述。 Enum16 用 'String'= Int16 对描述。
CREATE TABLE t_enum
(
x Enum8('pc' = 1, 'mobile' = 2, 'pad' = 3)
)
ENGINE = TinyLog
插入枚举表时,只能插入定义中列出的值,如pc,mobile,pad,插入未知的值会抛异常
gcw1 :) INSERT INTO t_enum VALUES ('pc'), ('pc'), ('pad');
INSERT INTO t_enum VALUES
Ok.
插入未知的值
gcw1 :) INSERT INTO t_enum VALUES ('pc1');
INSERT INTO t_enum VALUES
Exception on client:
Code: 36. DB::Exception: Unknown element 'pc1' for type Enum8('pc' = 1, 'mobile' = 2, 'pad' = 3)
Connecting to database default at localhost:19000 as user default.
Connected to ClickHouse server version 20.5.4 revision 54435.
7 数组
Array(T):由 T 类型元素组成的数组。
T 可以是任意类型,包含数组类型。
但不推荐使用多维数组,ClickHouse 对多维数组的支持有限。
例如,不能在 MergeTree 表中存储多维数组。
可以使用array函数来创建数组:
- array(T)
- 也可以使用方括号[]
ClickHouse能够自动推断数据类型
gcw1 :) select [1,2,3] as arr, toTypeName(arr);
SELECT
[1, 2, 3] AS arr,
toTypeName(arr)
┌─arr─────┬─toTypeName([1, 2, 3])─┐
│ [1,2,3] │ Array(UInt8) │
└─────────┴───────────────────────┘
8 元组
Tuple(T1, T2, ...):元组,其中每个元素都有单独的类型
gcw1 :) SELECT tuple(1,'a') AS x, (1,2,3) as y, toTypeName(x), toTypeName(y) ;
SELECT
(1, 'a') AS x,
(1, 2, 3) AS y,
toTypeName(x),
toTypeName(y)
┌─x───────┬─y───────┬─toTypeName(tuple(1, 'a'))─┬─toTypeName(tuple(1, 2, 3))─┐
│ (1,'a') │ (1,2,3) │ Tuple(UInt8, String) │ Tuple(UInt8, UInt8, UInt8) │
└─────────┴─────────┴───────────────────────────┴────────────────────────────┘
9 Date、DateTime
时间类型分为DateTime、DateTime64和Date三类。需要注意的是ClickHouse目前没有时间戳类型,也就是说,时间类型最高的精度是秒,所以如果需要处理毫秒、微秒精度的时间,则只能借助UInt类型实现
Date类型
用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值。日期中没有存储时区信息
CREATE TABLE t_date (x date) ENGINE=TinyLog;
INSERT INTO t_date VALUES('2021-11-06');
SELECT x,toTypeName(x) FROM t_date;
DateTime
用四个字节(无符号的)存储 Unix 时间戳。允许存储与日期类型相同的范围内的值。最小值为 0000-00-00 00:00:00。时间戳类型值精确到秒(没有闰秒)。时区使用启动客户端或服务器时的系统时区
CREATE TABLE t_datetime(`timestamp` DateTime) ENGINE = TinyLog;
INSERT INTO t_datetime Values('2020-11-06 00:00:00');
SELECT * FROM t_datetime;
┌───────────timestamp─┐
│ 2020-11-06 00:00:00 │
└─────────────────────┘
## DateTime类型是区分时区的
SELECT
toDateTime(timestamp, 'Asia/Shanghai') AS column,
toTypeName(column) AS x
FROM t_datetime
┌──────────────column─┬─x─────────────────────────┐
│ 2020-11-06 00:00:00 │ DateTime('Asia/Shanghai') │
└─────────────────────┴───────────────────────────┘
10 布尔类型
没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1
浙公网安备 33010602011771号