clickhouse 基本數據類型

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 │          │
└─────────────────┴──────────────────┴──────────┘

獲取年份 季度 月份 日期 時 分 秒 周等信息。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章