clickhouse有数值类型(整形,浮点数,定点数),字符串类型,日期时间类型,还有一些特别的数据类型。

没有Boolean类型,但是可以用整形的0和1替代。使用UInt即可。

0.支持的数据类型:

:) select * from system.data_type_families ;
┌─name────────────────────┬─case_insensitive─┬─alias_to────┐
│ IPv6                    │                0 │             │
│ IPv4                    │                0 │             │
│ IntervalYear            │                0 │             │
│ IntervalQuarter         │                0 │             │
│ IntervalMonth           │                0 │             │
│ IntervalDay             │                0 │             │
│ IntervalHour            │                0 │             │
│ IntervalSecond          │                0 │             │
│ AggregateFunction       │                0 │             │
│ Nothing                 │                0 │             │
│ Tuple                   │                0 │             │
│ Array                   │                0 │             │
│ Nullable                │                0 │             │
│ Int32                   │                0 │             │
│ Date                    │                1 │             │
│ Enum                    │                0 │             │
│ Enum8                   │                0 │             │
│ IntervalMinute          │                0 │             │
│ FixedString             │                0 │             │
│ LowCardinality          │                0 │             │
│ String                  │                0 │             │
│ DateTime                │                1 │             │
│ UUID                    │                0 │             │
│ Decimal64               │                1 │             │
│ Decimal32               │                1 │             │
│ Float64                 │                0 │             │
│ Int16                   │                0 │             │
│ DateTime64              │                1 │             │
│ Decimal128              │                1 │             │
│ Int8                    │                0 │             │
│ SimpleAggregateFunction │                0 │             │
│ Nested                  │                0 │             │
│ Int64                   │                0 │             │
│ Decimal                 │                1 │             │
│ IntervalWeek            │                0 │             │
│ UInt64                  │                0 │             │
│ Enum16                  │                0 │             │
│ UInt32                  │                0 │             │
│ UInt16                  │                0 │             │
│ Float32                 │                0 │             │
│ UInt8                   │                0 │             │
│ BINARY                  │                1 │ FixedString │
│ LONGBLOB                │                1 │ String      │
│ LONGTEXT                │                1 │ String      │
│ TINYTEXT                │                1 │ String      │
│ TEXT                    │                1 │ String      │
│ TINYINT                 │                1 │ Int8        │
│ DEC                     │                1 │ Decimal     │
│ VARCHAR                 │                1 │ String      │
│ MEDIUMBLOB              │                1 │ String      │
│ TIMESTAMP               │                1 │ DateTime    │
│ BLOB                    │                1 │ String      │
│ FLOAT                   │                1 │ Float32     │
│ INTEGER                 │                1 │ Int32       │
│ DOUBLE                  │                1 │ Float64     │
│ BIGINT                  │                1 │ Int64       │
│ TINYBLOB                │                1 │ String      │
│ CHAR                    │                1 │ String      │
│ MEDIUMTEXT              │                1 │ String      │
│ INT                     │                1 │ Int32       │
│ SMALLINT                │                1 │ Int16       │
└─────────────────────────┴──────────────────┴─────────────┘

61 rows in set. Elapsed: 0.002 sec. 

hadoop101 :) select * from system.data_type_families  where case_insensitive=1;
┌─name───────┬─case_insensitive─┬─alias_to────┐
│ Date       │                1 │             │
│ DateTime   │                1 │             │
│ Decimal64  │                1 │             │
│ Decimal32  │                1 │             │
│ DateTime64 │                1 │             │
│ Decimal128 │                1 │             │
│ Decimal    │                1 │             │
│ BINARY     │                1 │ FixedString │
│ LONGBLOB   │                1 │ String      │
│ LONGTEXT   │                1 │ String      │
│ TINYTEXT   │                1 │ String      │
│ TEXT       │                1 │ String      │
│ TINYINT    │                1 │ Int8        │
│ DEC        │                1 │ Decimal     │
│ VARCHAR    │                1 │ String      │
│ MEDIUMBLOB │                1 │ String      │
│ TIMESTAMP  │                1 │ DateTime    │
│ BLOB       │                1 │ String      │
│ FLOAT      │                1 │ Float32     │
│ INTEGER    │                1 │ Int32       │
│ DOUBLE     │                1 │ Float64     │
│ BIGINT     │                1 │ Int64       │
│ TINYBLOB   │                1 │ String      │
│ CHAR       │                1 │ String      │
│ MEDIUMTEXT │                1 │ String      │
│ INT        │                1 │ Int32       │
│ SMALLINT   │                1 │ Int16       │
└────────────┴──────────────────┴─────────────┘

27 rows in set. Elapsed: 0.015 sec. 

可以看到支持61中数据类型,有20种数据类型是为了兼容其他数据库的类型,主要是兼容MySQL的数据类型。
case_insensitive 选项为1 表示大小写不敏感,字段类型不区分大小写
                    为0 表示大小写敏感,即字段类型需要严格区分大小写。

1.整形

Clickhouse是使用C和C++类型写的,数据类型和C语言的类型息息相关。

1.1 Int

整形区分为有符号和无符号类型的整数。

有符号类型:整型范围(-2^n-1~2^n-1 -1): 8位=1字节

 

MySQL

Hive

Clickhouse

大小(字节)

数据范围

tinyint

tinyint

Int8

1

[-128 : 127]

smallint

smallint

Int16

2

[-32768 : 32767]

int

int

Int32

3

[-2147483648 : 2147483647]

bigint

bigint

Int64

4

[-9223372036854775808 : 9223372036854775807]

无符号类型:

无符号类型:整形范围0~2^n-1

MySQL

Hive

Clickhouse

大小(字节)

数据范围

Tinyint unsigned

 

UInt8

1

[0 : 255]

smallint unsigned

 

UInt16

2

[0 : 65535]

Int unsigned

  

UInt32

3

[0 : 4294967295]

Bigint unsigned

 

UInt64

4

[0 : 18446744073709551615]

 1.2 Float

MySQL

Clickhouse

大小字节

有效精度(位数)

float

Float32

4

7

double

Flout64

8

16

clickhouse 直接使用Float32代表单精度浮点数 使用Float64表示双精度浮点数。

使用浮点数需要注意它的精度是有限的,Float32从小数点后第8位,Float64从小数点后的第17位起会产生数据溢出。

hadoop101 :) select toFloat32('0.12345678901234567890') as a,toTypeName(a);


┌──────────a─┬─toTypeName(toFloat32('0.12345678901234567890'))─┐
│ 0.12345679 │ Float32                                         │
└────────────┴─────────────────────────────────────────────────┘

1 rows in set. Elapsed: 0.014 sec. 

hadoop101 :) select toFloat64('0.12345678901234567890') as a,toTypeName(a);


┌───────────────────a─┬─toTypeName(toFloat64('0.12345678901234567890'))─┐
│ 0.12345678901234568 │ Float64                                         │
└─────────────────────┴─────────────────────────────────────────────────┘

1 rows in set. Elapsed: 0.012 sec.
hadoop101 :) select 0.123456789123456789+0.987654321987654321 as b;

SELECT 0.12345678912345678 + 0.9876543219876543 AS b

┌──────────────────b─┐
│ 1.1111111111111112 │
└────────────────────┘

1 rows in set. Elapsed: 0.002 sec. 

hadoop101 :) select 0.123456789+0.987654321 as a;

SELECT 0.123456789 + 0.987654321 AS a

┌──────────a─┐
│ 1.11111111 │
└────────────┘

 clickhouse的浮点数支持正无穷,负无穷和非数字的表达方式:

select 1.0/0,-1/0,0/0;
┌─divide(1., 0)─┬─divide(-1, 0)─┬─divide(0, 0)─┐
│           inf │          -inf │          nan │
└───────────────┴───────────────┴──────────────┘
inf表示英文单词infinity  NaN 表示not-a-number

使用浮点数进行数据运算会数据数据计算不准确的情形:

 结论:Float32 和Float64 在数据精度较高的计算中会存在数据精度丢失,使用需谨慎。

1.3 Decimal

若需要要求更高的精度的数值运算,则需要使用定点数。Clickhouse提供了Decimal32,Decimal64,Decimal128三种精度的定点数。简写为Decimal32(S),Decimal64(S),Decimal128(S),原生方式为Decimal(P,S):

其中P表示精度precision,决定总位数(整数部分+小数位部分),取值范围为1--38

S代表规模 scale,决定小数位,取值范围是0--P。

简写方式和原生方式的对应表:

Decimal类型:

名称

等效声明

数据范围

Decimal32(S)

Decimal(1-9,S)

- ( -1 * 10^(9 - S), 1 * 10^(9 - S) )

Decimal64(S)

Decimal(10-18,S)

- ( -1 * 10^(18 - S), 1 * 10^(18 - S) )

Decimal128(S)

Decimal(19-38,S)

- ( -1 * 10^(38 - S), 1 * 10^(38 - S) )

MySQL         Clickhouse
Decimal(9,2)  Decimal32(2)
Decimal(22,6) Decimal128(6)

Decimal32(4) 表示的数据类型等同于MySQL的decimal(9,4)
数据范围为 -99999.9999 to 99999.9999 最小精度为0.0001

由于现代计算机只支持32bit和64bit,Decimal128在软件层面是由软件模拟实现,速度要比Decimal32和Decimal64慢。

在适用不同精度的定点数进行四则运算的时候小数位会发生变化:

四则运算规则:

运算名称

规则

加法

S=max(S1,S2)

减法

S=max(S1,S2)

乘法

S=S1+S2(S1>=S2)

除法

S=S1(S为分子,被除数,S1/S2)

Decimal类型Overflow

1.类型越界
2.类型不同
 SELECT toDecimal32(1, 8) < 100
DB::Exception: Can't compare. 
 SET decimal_check_overflow = 0
 SELECT toDecimal32(1, 8) < 100

┌─less(toDecimal32(1, 8), 100)─┐
│                            1 │
└──────────────────────────────┘

decimal_check_overflow 参数默认开启 参数值为1.

 SELECT toDecimal32(4.2, 8) AS x, 6 * x

DB::Exception: Decimal math overflow. 
SET decimal_check_overflow = 0;

hadoop101 :) SELECT toDecimal32(4.2, 8) AS x, 6 * x

┌──────────x─┬─multiply(6, toDecimal32(4.2, 8))─┐
│ 4.20000000 │                     -17.74967296 │
└────────────┴──────────────────────────────────┘

可以看到数值不对

hadoop101 :) SELECT toDecimal64(4.2, 8) AS x, 6 * x

SELECT 
    toDecimal64(4.2, 8) AS x, 
    6 * x

┌──────────x─┬─multiply(6, toDecimal64(4.2, 8))─┐
│ 4.20000000 │                      25.20000000 │
└────────────┴──────────────────────────────────┘

2.字符串类型:

2.1 String

String表示字符串类型,长度不限。在声明String类型的时候无须声明字符串的大小。String类型不限定字符集,理论上可以将任意编码的字符串存进来。但是为了规范和统一,推荐使用UTF-8字符集。

2.2FixedString 

和MySQL的CHAR比较类似,对于有明确长度的字符串可以使用。

和char不同的是FixedString使用Null字节填充末尾字符,而char使用空格填充。

hadoop101 :) select toFixedString('wuhan',10) as wh ,length(wh) as length;
┌─wh────┬─length─┐
│ wuhan │     10 │
└───────┴────────┘


hadoop101 :) select toFixedString('wuhan',10) as wh ,substring(wh,1,5) string,substring(wh,6,10) rest;

┌─wh────┬─string─┬─rest─┐
│ wuhan │ wuhan  │      │
└───────┴────────┴──────┘

2.3 UUID

UUID和MySQL中的UUID类似,格式为8-4-4-4-12

若一个UUID类型的字段在写入数据时候没有被赋值则按照格式使用0填充。

hadoop101 :) create table uuid(pkey UUID,name varchar ) ENGINE = Memory;

insert into uuid select generateUUIDv4(),'China';

insert into uuid(name) select 'WUHAN';

-- 查询
hadoop101 :) select pkey,name from uuid;

 
┌─────────────────────────────────pkey─┬─name──┐
│ 8df34966-a69d-4d1c-9936-5229d515f5f2 │ China │
└──────────────────────────────────────┴───────┘
┌─────────────────────────────────pkey─┬─name──┐
│ 00000000-0000-0000-0000-000000000000 │ WUHAN │
└──────────────────────────────────────┴───────┘

2 rows in set. Elapsed: 0.002 sec. 

3.时间类型:

Clickhouse支持Datetime,Datetime64 和Date类型

Datetime类型包含时分秒,精确到秒,支持用字符串形式插入。 [1970-01-01 00:00:00, 2105-12-31 23:59:59] 可以配合市区使用。
Datetime64 可以记录亚秒,在Datetime上增加了精度的设置。 语法:DateTime64(precision, [timezone])
Date 不包含具体的时间信息,只精确到天,支持字符串形式写入。 范围:1970-01-01 2105-12-31
最小输出为0000-00-00

hadoop101 :) create table dt(pk int,createtime datetime,createdate date,lastmodifytime datetime64(6)) engine=Memory;


查看表结构:
DESCRIBE TABLE dt

┌─name───────────┬─type──────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ pk             │ Int32         │              │                    │         │                  │                │
│ createtime     │ DateTime      │              │                    │         │                  │                │
│ createdate     │ Date          │              │                    │         │                  │                │
│ lastmodifytime │ DateTime64(6) │              │                    │         │                  │                │
└────────────────┴───────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘



insert into dt select 1,now(),'2020-06-09',now();

查看数据:
hadoop101 :) select * from dt;

┌─pk─┬──────────createtime─┬─createdate─┬─────────────lastmodifytime─┐
│  1 │ 2020-06-09 05:18:48 │ 2020-06-09 │ 2020-06-09 05:18:48.000000 │
└────┴─────────────────────┴────────────┴────────────────────────────┘


hadoop101 :) insert into dt(pk,createtime,createdate,lastmodifytime)values(2,'2020-06-10 12:30:45','2020-06-10','2020-06-10 18:30:45:123456');

INSERT INTO dt (pk, createtime, createdate, lastmodifytime) VALUES


Exception on client:
Code: 6. DB::Exception: Cannot parse string '2020-06-10 18:30:45:123456' as DateTime64(6): syntax error at position 19 (parsed just '2020-06-10 18:30:45')


hadoop101 :) insert into dt(pk,createtime,createdate,lastmodifytime)values(2,'2020-06-10 12:30:45','2020-06-10','2020-06-10 18:30:45');

hadoop101 :) select * from dt;

SELECT *
FROM dt

┌─pk─┬──────────createtime─┬─createdate─┬─────────────lastmodifytime─┐
│  1 │ 2020-06-09 05:18:48 │ 2020-06-09 │ 2020-06-09 05:18:48.000000 │
└────┴─────────────────────┴────────────┴────────────────────────────┘
┌─pk─┬──────────createtime─┬─createdate─┬─────────────lastmodifytime─┐
│  2 │ 2020-06-10 12:30:45 │ 2020-06-10 │ 2020-06-10 18:30:45.000000 │
└────┴─────────────────────┴────────────┴────────────────────────────┘

2 rows in set. Elapsed: 0.002 sec. 

 

其他支持的日期时间类型:

hadoop101 :) select * from system.data_type_families where name like 'Interval%';

┌─name────────────┬─case_insensitive─┬─alias_to─┐
│ IntervalYear    │                0 │          │
│ IntervalQuarter │                0 │          │
│ IntervalMonth   │                0 │          │
│ IntervalDay     │                0 │          │
│ IntervalHour    │                0 │          │
│ IntervalSecond  │                0 │          │
│ IntervalMinute  │                0 │          │
│ IntervalWeek    │                0 │          │
└─────────────────┴──────────────────┴──────────┘

获取年份 季度 月份 日期 时 分 秒 周等信息。

 

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐