Title

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

posted @ 2021-11-06 23:34  apeGcWell  阅读(299)  评论(0)    收藏  举报