ClickHouse數據定義

數據定義

 

ClickHouse的數據類型

ClickHouse是一款分析型數據庫,有多種數據庫類型,分爲基礎類型、複合類型和特殊類型。其中基礎類型使用ClickHouse具備了描述數據的基本能力,而另外兩種類型則是ClickHouse的數據表達能力更加豐富立體
 

基礎類型

基礎類型只有數值、字符串和時間三種類型,沒有Boolean類型,但可以使用整型的0或1代替
 

數值

數值類型:整型、浮點型和定點數三類

Int

常用Tinyint、Smallint、Int和Bigint指代整型的不同取值範圍。而ClickHouse則直接使用Int8、Int16、Int32、Int64指代4種大小的Int類型,其末尾的數字正好表名了佔用字節的大小(8位=1字節)
ClickHouse支持無符號的整型,使用前綴U表示

Float

ClickHouse直接使用Float32和Float64代表單精度浮點數以及雙精度浮點數
在使用浮點數的時候,應當要意識到它是有限精度的。例如,分別對Float32、Float64寫入超過有效精度的值,會發生什麼事?將擁有20位小數的數值分別寫入Float32和Float64,此時結果就會出現數據誤差

Decimal

如果要求更高精度的數值運算,則需要使用定點數。ClickHouse提供了Decimal32、Decimal64、Decimal128.可以通過兩種形式聲明定點:簡寫方式有Decimal32(S)、Decimal64(S)、Decimal128(S)三種,原生方式Decimal(P,S),其中:
P代表精度,決定總位數(整數部分+小數部分),取值範圍是1~38
S代表規模,決定小數位數,取值範圍是0~P
在使用定點數時還有一點值得注意:由於現代計算機系統只支持32位和64位CPU,所以Decimal128是在軟件層面模擬實現,它的速度會明顯慢於Decimal32與Decimal64
 

字符串類型

字符串類型可以細分爲String、FixedString和UUID三類

String

字符串由String定義,長度不限。使用String的時候無須聲明大小。他完全代替了傳統意義上數據庫的Varcaht、Text、Clob和Blob等字符類型。String類型不限定字符串,所以可以將任意編碼的字符串存入其中。但是爲了程序的規範性和可維護性,在同一套程序中應遵循使用統一的編碼,例如“UTF-8”

FixedString

FixedString類型和傳統意義上的Char類型有些類似,對於一些字符有明確長度的場合,可以使用固定長度的字符串。定長字符串通過FixedString(N)聲明,其中N表示字符串長度。但是Char不同的是,FixedString使用null字節填充末尾字符,而Char通常使用空格填充。比如例子,字符串‘abc’雖然只有3位,但是長度卻是5,因爲末尾有2位空字符填充

UUID

UUID是一種數據庫常見的主鍵類型,在ClickHouse中直接把它作爲一種數據類型。UUID共有32位,它的格式爲8-4-4-4-12。如果一個UUID類型的字段在寫入數據時沒有被賦值,則會依照格式使用0填充
 

時間類型

時間類型分爲DateTime、DateTime64、Date。ClickHouse目前沒有時間戳類型。時間類型最高的精度是秒,也就是說,如果需要毫秒、微妙等大於秒分辯率的時間,則只能藉助UInt類型實現。

DateTime

DateTime類型包括時、分、秒信息,精確到秒,支持使用字符串形式寫入

DateTime64

DateTime64可以記錄亞秒,它在DateTime之上增加了精度的設置

Date

Date類型不包含具體的時間信息,只精度到天,同樣支持字符串形式寫入
 

複合類型

ClickHouse還提供了數組、元祖、枚舉和嵌套四類複合類型。這些類型通常是其他數據庫原生不具備的特性。擁有了複合類型之後,ClickHouse的數據模型表達能力更強

Array

數組有兩種定義形式,常規方式array(T)或者[T]
ClickHouse數組擁有類型推斷的能力,推斷類型:以最小的存儲代價爲原則,即使用最小可表達的數據類型。例如array[1, 2]會通過自動推斷將UInt8作爲數組類型。但是數組元素中如果存在Null值,則元素將變爲Nullable。
一個數組內可以包含多種數據類型,例如[1, 2.0],是可行的,但是各類型之間必須兼容,例如[1, '2']則會報錯

Tuple

元祖類型由1~n個元素組成,每個元素之間允許設置不同的數據類型,且彼此之間不要求兼容。元祖同樣支持類型推斷,其推斷依據仍然以最小存儲代價爲原價。與數組類型,元祖也可以使用兩種方式定義,常規方式tuple(T)

Enum

ClickHouse支持枚舉類型,這是一種定義常量時經常會使用數據類型。ClickHouse提供了Enum8和Enum16兩種枚舉類型,他們除了取值範圍不同之外,沒有其他不同。枚舉固定使用(String:int)key/value鍵值對的形式定義數據,所以Enum8和Enum16分別對應(String:Int8)和(String:Int16)
Key和Value是不允許重複的,要確保唯一性。其次,Key和Value的值都不能爲null,但Key允許是空字符串。在寫入枚舉的時候,只會用到key字符串部分
在數據寫入過程中,會對照枚舉集合項的內容逐一檢查。如果Key字符串不在集合範圍內則會拋出異常
是否可以使用String代替枚舉?出於性能的考慮,因爲雖然枚舉定義中key屬於string類型,但是在後續對枚舉的操作中(排序、去重、分組等),會使用Int類型的Value值

Nested

嵌套類型,一張數據表,可以定義任意多個嵌套字段,但每個字段的嵌套層次支持一級,即嵌套表內不能繼續使用嵌套類型。對於簡單場景的層級關係或關聯關係,使用嵌套也是一種不錯的選擇

特殊類型

Nullable,並不是一個獨立類型,一種輔助修飾符,與基礎類型一起使用,表示某個基礎數據類型可以是Null值,不能用於數組和元組這些複合類型,也不能作爲索引字段,其次,應該慎用Nullable類型,包括Nullable的數據表,不然會使查詢和寫入性能變慢,正常情況下,每個列字段的數據會被存儲在對應[Column].bin文件中,如果一個列字段被Nullable類型修飾後,會額外生成一個[Collumn].null.bin文件專門保存它的null值,這意味着在讀取和寫入數據時,需要一倍的額外文件操作
Domain,IPv4和IPv6兩類,本質上它們是對整型和字符串進一步封裝,IPv4類型是基於UInt32封裝的。和存儲字符串存儲不同的是?1. 出於便捷性的考慮,例如IPv4支持支持格式檢查,格式錯誤IP數據是無法被寫入的,2. 出於性能的考量,同樣以IPv4爲例,IPv4使用UInt32存儲,相比String更加緊湊,佔用的空間跟小,查詢性能更快,IPv6類型是基於FixedString(16)封裝的,它的使用方法與IPv4別無二致。Domain看上去是string,但Domain類型並不是字符串,所以它不支持隱式的自動類型轉換,如果需要返回IP的字符串形式,顯示調用IPv4NumToString或IPv6NumToString函數進行轉換

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