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 │ │
└─────────────────┴──────────────────┴──────────┘
獲取年份 季度 月份 日期 時 分 秒 周等信息。