- 整型
有符號整型:Int8, Int16, Int32, Int64
無符號整型:UInt8, UInt16, UInt32, UInt64 - 浮點數(shù)(Float32, Float64)
建議盡可能以整數(shù)形式存儲數(shù)據(jù)啤握。
對浮點數(shù)進行計算可能引起四舍五入的誤差。
浮點計算結(jié)果可能是諸如正無窮大(inf)、負無窮大(-inf)和"非數(shù)字"(nan)漱挚。
SELECT 1 - 0.9 # 0.09999999999999998
SELECT 0.5 / 0 # inf
SELECT -0.5 / 0 # -inf
SELECT 0 / 0 # nan
- 有符號的定點數(shù)(Decimal(P, S), Decimal32(S), Decimal64(S), Decimal128(S))
有符號的定點數(shù)会放,可在加著摔、減和乘法運算過程中保持精度布蔗。對于除法衅码,最低有效數(shù)字會被丟棄(不舍入)拯刁。
P - 精度。有效范圍:[1:38]逝段,決定可以有多少個十進制數(shù)字(包括分數(shù))垛玻。
S - 規(guī)模。有效范圍:[0:P]奶躯,決定數(shù)字的小數(shù)部分中包含的小數(shù)位數(shù)帚桩。
在對 Decimal 類型執(zhí)行操作時,數(shù)值可能會發(fā)生溢出嘹黔。分數(shù)中的過多數(shù)字被丟棄(不是舍入的)账嚎。整數(shù)中的過多數(shù)字將導(dǎo)致異常。
檢查溢出會導(dǎo)致計算變慢儡蔓。如果已知溢出不可能郭蕉,則可以通過設(shè)置decimal_check_overflow來禁用溢出檢查,在這種情況下喂江,溢出將導(dǎo)致結(jié)果不正確: - 布爾值
沒有單獨的類型來存儲布爾值召锈。可以使用 UInt8 類型获询,取值限制為 0 或 1涨岁。 - 變長字符串(String)
字符串可以任意長度的。它可以包含任意的字節(jié)集筐付,包含空字節(jié)卵惦。 - 定長字符串(FixedString(N))
固定長度 N 的字符串。N 必須是嚴格的正自然數(shù)瓦戚。 當服務(wù)端讀取長度小于 N 的字符串時候(例如解析 INSERT 數(shù)據(jù)時),通過在字符串末尾添加空字節(jié)來達到 N 字節(jié)長度丛塌。 當服務(wù)端讀取長度大于 N 的字符串時候较解,將返回錯誤消息畜疾。 當服務(wù)器寫入一個字符串(例如,當輸出 SELECT 查詢的結(jié)果)時印衔,NULL字節(jié)不會從字符串的末尾被移除啡捶,而是被輸出。 - 通用唯一標識符(UUID)
通用唯一標識符(UUID)是用于標識記錄的16字節(jié)數(shù)字奸焙。
如果在插入新記錄時未指定UUID列值瞎暑,則UUID值將填充為零:00000000-0000-0000-0000-000000000000
要生成UUID值,ClickHouse提供generateUUIDv4()函數(shù)与帆。
select generateUUIDv4() # 29fc209d-eba3-4adf-b7cb-d4600036d10a
UUID數(shù)據(jù)類型不支持算術(shù)運算(例如了赌,abs)或聚合函數(shù)(例如sum和avg)。
UUID數(shù)據(jù)類型僅支持String數(shù)據(jù)類型也支持的函數(shù)(例如玄糟,min勿她,max和count)。
- 日期(Date)
日期類型阵翎,用兩個字節(jié)存儲逢并,表示從 1970-01-01 (無符號) 到當前的日期值。
最小值輸出為0000-00-00郭卫。 - 時間戳(DateTime)
時間戳類型砍聊。用四個字節(jié)(無符號的)存儲 Unix 時間戳)。允許存儲與日期類型相同的范圍內(nèi)的值贰军。最小值為 0000-00-00 00:00:00玻蝌。時間戳類型值精確到秒。 - 枚舉類型(Enum8, Enum16)
Enum 保存 'string'= integer 的對應(yīng)關(guān)系谓形。在 ClickHouse 中灶伊,盡管用戶使用的是字符串常量,但所有含有 Enum 數(shù)據(jù)類型的操作都是按照包含整數(shù)的值來執(zhí)行寒跳。這在性能方面比使用 String 數(shù)據(jù)類型更有效聘萨。
Enum8 用 'String'= Int8 對描述。
Enum16 用 'String'= Int16 對描述童太。
CREATE TABLE t_enum
(
x Enum8('hello' = 1, 'world' = 2)
)
ENGINE = TinyLog
#
INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello')
這個 x 列只能存儲類型定義中列出的值:'hello'或'world'米辐。如果您嘗試保存任何其他值,ClickHouse 拋出異常书释。
- 數(shù)組(Array(T))
由 T 類型元素組成的數(shù)組翘贮。
T 可以是任意類型,包含數(shù)組類型爆惧。 但不推薦使用多維數(shù)組狸页,ClickHouse 對多維數(shù)組的支持有限。
可以使用array()函數(shù)和中括號來創(chuàng)建數(shù)組
SELECT array(1, 2)
SELECT [1, 2]
如果在元素中存在 NULL或存在 Nullable類型元素,那么數(shù)組的元素類型將會變成 Nullable芍耘。
如果 ClickHouse 無法確定數(shù)據(jù)類型址遇,它將產(chǎn)生異常。
- 元組(Tuple(T1, T2, ...))
元組斋竞,其中每個元素都有單獨的類型倔约。
SELECT tuple(1,'a')
- 缺失值(Nullable(TypeName))
允許用特殊標記NULL表示"缺失值",可以與TypeName
的正常值存放一起坝初。例如浸剩,Nullable(Int8)
類型的列可以存儲Int8
類型值,而沒有值的行將存儲NULL
鳄袍。
對于TypeName
绢要,不能使用復(fù)合數(shù)據(jù)類型 Array和 Tuple。復(fù)合數(shù)據(jù)類型可以包含Nullable
類型值畦木,例如Array(Nullable(Int8))
袖扛。
Nullable
類型字段不能包含在表索引中。
除非在 ClickHouse 服務(wù)器配置中另有說明十籍,否則NULL
是任何Nullable
類型的默認值蛆封。
使用 Nullable 幾乎總是對性能產(chǎn)生負面影響。
CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLog
#
INSERT INTO t_null VALUES (1, NULL)
- 嵌套(Nested(Name1 Type1, Name2 Type2, ...))
嵌套數(shù)據(jù)結(jié)構(gòu)類似于嵌套表勾栗。嵌套數(shù)據(jù)結(jié)構(gòu)的參數(shù)(列名和類型)與 CREATE 查詢類似惨篱。每個表可以包含任意多行嵌套數(shù)據(jù)結(jié)構(gòu)。
只支持一級嵌套围俘。嵌套結(jié)構(gòu)的列中砸讳,若列的類型是數(shù)組類型,那么該列其實和多維數(shù)組是相同的界牡,所以目前嵌套層級的支持很局限(MergeTree 引擎中不支持存儲這樣的列)
大多數(shù)情況下簿寂,處理嵌套數(shù)據(jù)結(jié)構(gòu)時,會指定一個單獨的列宿亡。為了這樣實現(xiàn)常遂,列的名稱會與點號連接起來。這些列構(gòu)成了一組匹配類型挽荠。在同一條嵌套數(shù)據(jù)中克胳,所有的列都具有相同的長度。
不能對整個嵌套數(shù)據(jù)結(jié)構(gòu)執(zhí)行 SELECT圈匆。只能明確列出屬于它一部分列漠另。
CREATE TABLE test.visits
(
CounterID UInt32,
StartDate Date,
Sign Int8,
IsNew UInt8,
VisitID UInt64,
UserID UInt64,
...
Goals Nested
(
ID UInt32,
Serial UInt32,
EventTime DateTime,
Price Int64,
OrderID String,
CurrencyID UInt32
),
...
) ENGINE = CollapsingMergeTree(StartDate, intHash32(UserID), (CounterID, StartDate, intHash32(UserID), VisitID), 8192, Sign)
- Nothing
此數(shù)據(jù)類型的唯一目的是表示不是期望值的情況。 所以不能創(chuàng)建一個Nothing
類型的值跃赚。
例如笆搓,文本 NULL 的類型為Nullable(Nothing)
。