1 、與其他框架比較
2、整型
固定長度的整型,包括有符號整型或無符號整型。
整型范圍(-2n-1~2n-1-1):
Int8 - [-128 : 127]
Int16 - [-32768 : 32767]
Int32 - [-2147483648 : 2147483647]
Int64 - [-9223372036854775808 : 9223372036854775807]
無符號整型范圍(0~2n-1):
UInt8 - [0 : 255]
UInt16 - [0 : 65535]
UInt32 - [0 : 4294967295]
UInt64 - [0 : 18446744073709551615]
3、浮點型
Float32 - float
Float64 – double
建議盡可能以整數形式存儲數據。例如,將固定精度的數字轉換為整數值,如時間用毫秒為單位表示,因為浮點型進行計算時可能引起四舍五入的誤差。
:) select 1-0.9
┌───────minus(1, 0.9)─┐
│ 0.09999999999999998 │
└─────────────────────┘
與標准SQL相比,ClickHouse 支持以下類別的浮點數:
Inf-正無窮:
:) select 1/0
┌─divide(1, 0)─┐
│ inf │
└──────────────┘
-Inf-負無窮:
:) select -1/0
┌─divide(1, 0)─┐
│ -inf │
└──────────────┘
NaN-非數字:
:) select 0/0
┌─divide(0, 0)─┐
│ nan │
└──────────────┘
4、 布爾型
沒有單獨的類型來存儲布爾值。可以使用 UInt8 類型,取值限制為 0 或 1。
5、 字符串
String
字符串可以任意長度的。它可以包含任意的字節集,包含空字節。
FixedString(N)
固定長度 N 的字符串,N 必須是嚴格的正自然數。當服務端讀取長度小於 N 的字符串時候,通過在字符串末尾添加空字節來達到 N 字節長度。 當服務端讀取長度大於 N 的字符串時候,將返回錯誤消息。
與String相比,極少會使用FixedString,因為使用起來不是很方便。
6、 枚舉類型
包括 Enum8 和 Enum16 類型。Enum 保存 'string'= integer 的對應關系。
Enum8 用 'String'= Int8 對描述。
Enum16 用 'String'= Int16 對描述。
用法演示:
創建一個帶有一個枚舉 Enum8('hello' = 1, 'world' = 2) 類型的列:
CREATE TABLE t_enum(x Enum8('hello' = 1, 'world' = 2))ENGINE = TinyLog
這個 x
列只能存儲類型定義中列出的值:'hello'
或'world'
。如果嘗試保存任何其他值,ClickHouse 拋出異常。
:) INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello')
INSERT INTO t_enum VALUES
Ok.
3 rows in set. Elapsed: 0.002 sec.
:) insert into t_enum values('a')
INSERT INTO t_enum VALUES
Exception on client:
Code: 49. DB::Exception: Unknown element 'a' for type Enum8('hello' = 1, 'world' = 2)
從表中查詢數據時,ClickHouse 從 Enum
中輸出字符串值。
SELECT * FROM t_enum
┌─x─────┐
│ hello │
│ world │
│ hello │
└───────┘
如果需要看到對應行的數值,則必須將 Enum
值轉換為整數類型。
SELECT CAST(x, 'Int8') FROM t_enum
┌─CAST(x, 'Int8')─┐
│ 1 │
│ 2 │
│ 1 │
└─────────────────┘
7、 數組
Array(T):由 T 類型元素組成的數組。
T 可以是任意類型,包含數組類型。 但不推薦使用多維數組,ClickHouse 對多維數組的支持有限。例如,不能在 MergeTree 表中存儲多維數組。
可以使用array函數來創建數組:
array(T)
也可以使用方括號:[]
創建數組案例:
:) SELECT array(1, 2) AS x, toTypeName(x)
SELECT
[1, 2] AS x,
toTypeName(x)
┌─x─────┬─toTypeName(array(1, 2))─┐
│ [1,2] │ Array(UInt8) │
└───────┴─────────────────────────┘
1 rows in set. Elapsed: 0.002 sec.
:) SELECT [1, 2] AS x, toTypeName(x)
SELECT[1, 2] AS x,toTypeName(x)
┌─x─────┬─toTypeName([1, 2])─┐
│ [1,2] │ Array(UInt8) │
└───────┴────────────────────┘
1 rows in set. Elapsed: 0.002 sec.
8、元組
Tuple(T1, T2, ...):元組,其中每個元素都有單獨的類型。
創建元組的示例:
:) SELECT tuple(1,'a') AS x, toTypeName(x)
SELECT
(1, 'a') AS x,
toTypeName(x)
┌─x───────┬─toTypeName(tuple(1, 'a'))─┐
│ (1,'a') │ Tuple(UInt8, String) │
└─────────┴───────────────────────────┘
1 rows in set. Elapsed: 0.021 sec.
9、 Date
日期類型,用兩個字節存儲,表示從 1970-01-01 (無符號) 到當前的日期值,最小值輸出為0000-00-00
10、時間戳DateTime
用四個字節(無符號的)存儲 Unix 時間戳,允許存儲與日期類型相同的范圍內的值。最小值為 0000-00-00 00:00:00,時間戳類型值精確到秒。