本文是clickhouse專欄第五篇,更多內容請關注本號歷史文章!
一、資料型別表
clickhouse內建了很多的column資料型別,可以通過查詢system.data_type_families
這張表獲取版本的所有支援的資料型別。下文中第一列是欄位型別,第二列表示該型別的欄位型別是否區分大小寫(1表示不區分大小寫,Date和date都是有效的資料型別名稱),第三類是該欄位型別的別名。
peer1 :) SELECT * FROM system.data_type_families;
┌─name────────────────────────────┬─case_insensitive─┬─alias_to────┐
│ Polygon │ 0 │ │
│ Ring │ 0 │ │
│ Point │ 0 │ │
│ MultiPolygon │ 0 │ │
│ IPv6 │ 0 │ │
│ IntervalSecond │ 0 │ │
│ IPv4 │ 0 │ │
│ UInt32 │ 0 │ │
│ IntervalYear │ 0 │ │
│ IntervalQuarter │ 0 │ │
│ IntervalMonth │ 0 │ │
│ Int64 │ 0 │ │
│ IntervalDay │ 0 │ │
│ IntervalHour │ 0 │ │
│ UInt256 │ 0 │ │
│ Int16 │ 0 │ │
│ LowCardinality │ 0 │ │
│ AggregateFunction │ 0 │ │
│ Nothing │ 0 │ │
│ Decimal256 │ 1 │ │
│ Tuple │ 0 │ │
│ Array │ 0 │ │
│ Enum16 │ 0 │ │
│ IntervalMinute │ 0 │ │
│ FixedString │ 0 │ │
│ String │ 0 │ │
│ DateTime │ 1 │ │
│ Map │ 0 │ │
│ UUID │ 0 │ │
│ Decimal64 │ 1 │ │
│ Nullable │ 0 │ │
│ Enum │ 0 │ │
│ Int32 │ 0 │ │
│ UInt8 │ 0 │ │
│ Date │ 1 │ │
│ Decimal32 │ 1 │ │
│ UInt128 │ 0 │ │
│ Float64 │ 0 │ │
│ SimpleAggregateFunction │ 0 │ │
│ Nested │ 0 │ │
│ DateTime64 │ 1 │ │
│ Int128 │ 0 │ │
│ Decimal128 │ 1 │ │
│ Int8 │ 0 │ │
│ Decimal │ 1 │ │
│ Int256 │ 0 │ │
│ IntervalWeek │ 0 │ │
│ UInt64 │ 0 │ │
│ Enum8 │ 0 │ │
│ DateTime32 │ 1 │ │
│ UInt16 │ 0 │ │
│ Float32 │ 0 │ │
│ INET6 │ 1 │ IPv6 │
│ INET4 │ 1 │ IPv4 │
│ BINARY │ 1 │ FixedString │
│ NATIONAL CHAR VARYING │ 1 │ String │
│ BINARY VARYING │ 1 │ String │
│ NCHAR LARGE OBJECT │ 1 │ String │
│ NATIONAL CHARACTER VARYING │ 1 │ String │
│ NATIONAL CHARACTER LARGE OBJECT │ 1 │ String │
│ NATIONAL CHARACTER │ 1 │ String │
│ NATIONAL CHAR │ 1 │ String │
│ CHARACTER VARYING │ 1 │ String │
│ LONGBLOB │ 1 │ String │
│ MEDIUMTEXT │ 1 │ String │
│ TEXT │ 1 │ String │
│ TINYBLOB │ 1 │ String │
│ VARCHAR2 │ 1 │ String │
│ CHARACTER LARGE OBJECT │ 1 │ String │
│ DOUBLE PRECISION │ 1 │ Float64 │
│ LONGTEXT │ 1 │ String │
│ NVARCHAR │ 1 │ String │
│ INT1 UNSIGNED │ 1 │ UInt8 │
│ VARCHAR │ 1 │ String │
│ CHAR VARYING │ 1 │ String │
│ MEDIUMBLOB │ 1 │ String │
│ NCHAR │ 1 │ String │
│ CHAR │ 1 │ String │
│ SMALLINT UNSIGNED │ 1 │ UInt16 │
│ TIMESTAMP │ 1 │ DateTime │
│ FIXED │ 1 │ Decimal │
│ TINYTEXT │ 1 │ String │
│ NUMERIC │ 1 │ Decimal │
│ DEC │ 1 │ Decimal │
│ TINYINT UNSIGNED │ 1 │ UInt8 │
│ INTEGER UNSIGNED │ 1 │ UInt32 │
│ INT UNSIGNED │ 1 │ UInt32 │
│ CLOB │ 1 │ String │
│ MEDIUMINT UNSIGNED │ 1 │ UInt32 │
│ BOOL │ 1 │ Int8 │
│ SMALLINT │ 1 │ Int16 │
│ INTEGER SIGNED │ 1 │ Int32 │
│ NCHAR VARYING │ 1 │ String │
│ INT SIGNED │ 1 │ Int32 │
│ TINYINT SIGNED │ 1 │ Int8 │
│ BIGINT SIGNED │ 1 │ Int64 │
│ BINARY LARGE OBJECT │ 1 │ String │
│ SMALLINT SIGNED │ 1 │ Int16 │
│ MEDIUMINT │ 1 │ Int32 │
│ INTEGER │ 1 │ Int32 │
│ INT1 SIGNED │ 1 │ Int8 │
│ BIGINT UNSIGNED │ 1 │ UInt64 │
│ BYTEA │ 1 │ String │
│ INT │ 1 │ Int32 │
│ SINGLE │ 1 │ Float32 │
│ FLOAT │ 1 │ Float32 │
│ MEDIUMINT SIGNED │ 1 │ Int32 │
│ BOOLEAN │ 1 │ Int8 │
│ DOUBLE │ 1 │ Float64 │
│ INT1 │ 1 │ Int8 │
│ CHAR LARGE OBJECT │ 1 │ String │
│ TINYINT │ 1 │ Int8 │
│ BIGINT │ 1 │ Int64 │
│ CHARACTER │ 1 │ String │
│ BYTE │ 1 │ Int8 │
│ BLOB │ 1 │ String │
│ REAL │ 1 │ Float32 │
└─────────────────────────────────┴──────────────────┴─────────────┘
二、基礎資料型別
clickhouse和傳統的資料庫一樣,提供了基礎的資料型別,這一部分就簡單的介紹一下,相信學過程式語言的同學對這一部分並不陌生。
整數型別
整數型別,IntN隨著N的增大,整型數值的範圍擴大。U表示unsigned無符號,無符號就是沒有負數符號,只能儲存大於等於0的樹。
- 有符號整型(IntN):Int8、Int16、Int32、Int64、Int128、Int256。數值範圍是【-2^(N-1) ~ 2^(N-1)-1】,比如:Int8(-128到127)
- 無符號整型(UIntN):UInt8、UInt16、UInt32、UInt64、UInt128、UInt256。數值範圍是【0 ~ 2^N-1】,比如:UInt8(0到255)
浮點型別
- 單精度浮點數Float32,學過C、java、mysql的朋友把它當作float資料型別使用即可。從小數點後第8位起會發生精度丟失。
- 雙精度浮點數Float64,學過C、java、mysql的朋友把它當作double資料型別使用即可。從小數點後第17位起會發生精度丟失。
Decimal型別
有的時候Float32、Float64無法滿足計算精度的要求,我們就需要使用Decimal資料型別。ClickHouse 提供了 Decimal32、Decimal64 和 Decimal128 三種精度的Decimal。
在定義表欄位的型別時,可以通過兩種形式宣告:簡寫方式有 Decimal32(S)、Decimal64(S)、Decimal128(S) 三種,原生方式為 Decimal(P, S),表示該定點數的整數位加上小數位的總長度最大為 P,其中小數位長度最多為 S。
參考下面的SQL及輸出結果進行理解和學習
SELECT
toDecimal64(2, 3) AS x, --數值為2,精度為3,所以2.000
toTypeName(x) AS xtype,
toDecimal32(2, 2) AS y, --數值為2,精度為2,所以2.00
toTypeName(y) as ytype,
x + y AS a, --2.000 + 2.00,加減法取最大精度。所以4.000
toTypeName(a) AS atype,
x * y AS b, --2.000*2.00,乘法的精度值相加(2+3=5)。所以4.00000
toTypeName(b) AS btype,
x / y AS c, --2.000/2.00,被除數2.000精度是3,結果精度等於被除數精度。所以1.000
toTypeName(c) AS ctype;
下圖為上面的SQL的執行結果
普通String型別
clickhouse 中的String型別並沒有長度限制,所以它可以代替傳統關係型資料庫中的所有以字元形式存在的資料型別,如:CHAR、VARCHAR、CLOB 等等。
FixedString型別
FixedString(N)表示固定長度為N的資料型別,可以使用toFixedString函式將String轉換成FixedString。下文中的SQL雖然zimug
長度是5,但使用FixedString(6)長度為6,實際儲存內容是zimug\0
。
peer1 :) select toFixedString('zimug', 6), length(toFixedString('zimug', 6));
┌─toFixedString('zimug', 6)─┬─length(toFixedString('zimug', 6))─┐
│ zimug │ 6 │
└───────────────────────────┴───────────────────────────────────┘
UUID
UUID是比較常見的資料唯一值,ClickHouse把它作為一種資料型別。UUID資料格式如:6fb875ae-75b9-4643-a146-5a1de7c717b4
,使用方式如下:
使用示例如下:
-- 建表時建立UUID資料型別欄位
CREATE TABLE test_uuid (id UUID, content String) ENGINE=TinyLog;
-- 向表中插入資料
INSERT INTO test_uuid SELECT generateUUIDv4(), 'test uuid 1';
-- 插入的時候不為UUID賦值,UUID欄位使用0填充
INSERT INTO test_uuid (content) VALUES ('test uuid 2');
日期型別
日期資料型別有三種:DateTime、DateTime64和Date,並且支援使用字串的方式insert寫入日期格式。另外還有一種日期型別TIMESTAMP ,其使用方法和DateTime型別一摸一樣,只是對DateTime資料型別起了一個別名。
- DateTime精確到秒,如:'2022-06-12 06:06:06'
- DateTime64精確到亞秒,如:'2022-06-12 06:06:06.000'
- Date不包含時間資訊,精確到天,如:'2022-06-12'
布林型別
ClickHouse布林資料型別BOOLEAN 。其實際儲存就是使用UInt8 型別,取值限制為0或 1。