一 :如何查看clickhouse具體支持哪些數據類型?
1:查看官方文檔:https://clickhouse.tech/docs/en/sql-reference/data-types/
2:查看系統表:select * from system.data_type_families;

SELECT * FROM system.data_type_families ┌─name────────────────────────────┬─case_insensitive─┬─alias_to────┐ │ Ring │ 0 │ │ │ Polygon │ 0 │ │ │ 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 │ │ │ Point │ 0 │ │ │ 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 │ │ │ MultiPolygon │ 0 │ │ │ UInt8 │ 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 │ │ CLOB │ 1 │ String │ │ MEDIUMTEXT │ 1 │ String │ │ NUMERIC │ 1 │ Decimal │ │ TINYTEXT │ 1 │ String │ │ TEXT │ 1 │ String │ │ TINYBLOB │ 1 │ String │ │ VARCHAR2 │ 1 │ String │ │ DOUBLE PRECISION │ 1 │ Float64 │ │ CHARACTER LARGE OBJECT │ 1 │ String │ │ LONGTEXT │ 1 │ String │ │ NVARCHAR │ 1 │ String │ │ INT1 UNSIGNED │ 1 │ UInt8 │ │ VARCHAR │ 1 │ String │ │ INT │ 1 │ Int32 │ │ SINGLE │ 1 │ Float32 │ │ BYTEA │ 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 │ │ LONGBLOB │ 1 │ String │ │ DEC │ 1 │ Decimal │ │ TINYINT UNSIGNED │ 1 │ UInt8 │ │ INTEGER UNSIGNED │ 1 │ UInt32 │ │ INT UNSIGNED │ 1 │ UInt32 │ │ BLOB │ 1 │ String │ │ REAL │ 1 │ Float32 │ │ BOOL │ 1 │ Int8 │ │ SMALLINT │ 1 │ Int16 │ │ INTEGER SIGNED │ 1 │ Int32 │ │ NCHAR VARYING │ 1 │ String │ │ INT SIGNED │ 1 │ Int32 │ │ BIGINT SIGNED │ 1 │ Int64 │ │ BINARY LARGE OBJECT │ 1 │ String │ │ SMALLINT SIGNED │ 1 │ Int16 │ │ TINYINT SIGNED │ 1 │ Int8 │ │ INTEGER │ 1 │ Int32 │ │ INT1 SIGNED │ 1 │ Int8 │ │ BIGINT UNSIGNED │ 1 │ UInt64 │ │ FLOAT │ 1 │ Float32 │ │ 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 │ └─────────────────────────────────┴──────────────────┴─────────────┘ 107 rows in set. Elapsed: 0.003 sec.
二:clickhouse支持的常見的數據類型
2.1:int: 整型
Int Ranges (有符號的整型)
- Int8 - [-128 : 127]
- Int16 - [-32768 : 32767]
- Int32 - [-2147483648 : 2147483647]
- Int64 - [-9223372036854775808 : 9223372036854775807]
Uint Ranges (無符號的整型)
- UInt8 - [0 : 255]
- UInt16 - [0 : 65535]
- UInt32 - [0 : 4294967295]
- UInt64 - [0 : 18446744073709551615]
2.2:float: 浮點數
Float32
-float
Float64
-double
建議盡可能以整數形式存儲數據。
對浮點數進行計算可能引起四舍五入的誤差。
浮點計算結果可能是諸如正無窮大(inf)、負無窮大(-inf)和"非數字"(nan)。
SELECT 1 - 0.9 # 0.09999999999999998 SELECT 0.5 / 0 # inf SELECT -0.5 / 0 # -inf SELECT 0 / 0 # nan
2.3:Decimal(P,S): 有符號的定點數
有符號的定點數,可在加、減和乘法運算過程中保持精度。對於除法,最低有效數字會被丟棄(不舍入)。
- P - 精度。有效范圍:[1:38],決定可以有多少個十進制數字(包括分數)。
- S - 規模。有效范圍:[0:P],決定數字的小數部分中包含的小數位數。
對於不同的 P 參數值 Decimal 表示,以下例子都是同義的:
-P從[1:9]-對於Decimal32(S)
-P從[10:18]-對於Decimal64(小號)
-P從[19:38]-對於Decimal128(S)
十進制值范圍
- Decimal32(S) - ( -1 * 10^(9 - S),1*10^(9-S) )
- Decimal64(S) - ( -1 * 10^(18 - S),1*10^(18-S) )
- Decimal128(S) - ( -1 * 10^(38 - S),1*10^(38-S) )
例如,Decimal32(4) 可以表示 -99999.9999 至 99999.9999 的數值,步長為0.0001。
2.3:布爾值
沒有單獨的類型來存儲布爾值。可以使用 UInt8 類型,取值限制為 0 或 1。
2.4:String:變長字符串
字符串可以任意長度的。它可以包含任意的字節集,包含空字節。
2.4:FixedString(N):變長字符串
固定長度 N 的字符串。N 必須是嚴格的正自然數。
當數據的長度恰好為N個字節時,FixedString
類型是高效的。 在其他情況下,這可能會降低效率。
當向ClickHouse中插入數據時,
- 如果字符串包含的字節數少於`N’,將對字符串末尾進行空字節填充。
- 如果字符串包含的字節數大於
N
,將拋出Too large value for FixedString(N)
異常。
當做數據查詢時,ClickHouse不會刪除字符串末尾的空字節。 如果使用WHERE
子句,則須要手動添加空字節以匹配FixedString
的值。
以下示例闡明了如何將WHERE
子句與FixedString
一起使用。
考慮帶有FixedString(2)
列的表:
┌─name──┐ │ b │ └───────┘
查詢語句SELECT * FROM FixedStringTable WHERE a = 'b'
不會返回任何結果。請使用空字節來填充篩選條件。
SELECT * FROM FixedStringTable WHERE a = 'b\0'
┌─a─┐ │ b │ └───┘
這種方式與MySQL的CHAR
類型的方式不同(MySQL中使用空格填充字符串,並在輸出時刪除空格)。
請注意,FixedString(N)
的長度是個常量。僅由空字符組成的字符串,函數length返回值為N
,而函數empty的返回值為1
。
2.5:UUID:通用唯一標識符
通用唯一標識符(UUID)是用於標識記錄的16字節數字。
如果在插入新記錄時未指定UUID列值,則UUID值將填充為零:00000000-0000-0000-0000-000000000000
要生成UUID值,ClickHouse提供generateUUIDv4()函數。
select generateUUIDv4() # 29fc209d-eba3-4adf-b7cb-d4600036d10a
UUID數據類型不支持算術運算(例如,abs)或聚合函數(例如sum和avg)。
UUID數據類型僅支持String數據類型也支持的函數(例如,min,max和count)。
2.6:Date:日期
日期類型,用兩個字節存儲,表示從 1970-01-01 (無符號) 到當前的日期值。
允許存儲從 Unix 紀元開始到編譯階段定義的上限閾值常量(目前上限是2106年,但最終完全支持的年份為2105)。最小值輸出為1970-01-01。
日期中沒有存儲時區信息。
2.7:Datetime:時間戳
時間戳類型。用四個字節(無符號的)存儲 Unix 時間戳。允許存儲與日期類型相同的范圍內的值。最小值為 1970-01-01 00:00:00。時間戳類型值精確到秒(沒有閏秒)。
時區:
使用啟動客戶端或服務器時的系統時區,時間戳是從文本(分解為組件)轉換為二進制並返回。在文本格式中,有關夏令時的信息會丟失。
默認情況下,客戶端連接到服務的時候會使用服務端時區。您可以通過啟用客戶端命令行選項 --use_client_time_zone
來設置使用客戶端時間。
因此,在處理文本日期時(例如,在保存文本轉儲時),請記住在夏令時更改期間可能存在歧義,如果時區發生更改,則可能存在匹配數據的問題。
2.8:Enum:枚舉
枚舉類型(Enum8, Enum16)
Enum 保存 'string'= integer 的對應關系。
在 ClickHouse 中,盡管用戶使用的是字符串常量,但所有含有 Enum 數據類型的操作都是按照包含整數的值來執行。這在性能方面比使用 String 數據類型更有效。
Enum8 用 'String'= Int8 對描述。
Enum16 用 'String'= Int16 對描述。
CREATE TABLE t_enum ( x Enum('hello' = 1, 'world' = 2) ) ENGINE = TinyLog INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello')
這個 x 列只能存儲類型定義中列出的值:'hello'或'world'。如果您嘗試保存任何其他值,ClickHouse 拋出異常。
2.9:Nullable:可為空/缺失值
允許用特殊標記 (NULL) 表示«缺失值»,可以與 TypeName
的正常值存放一起。例如,Nullable(Int8)
類型的列可以存儲 Int8
類型值,而沒有值的行將存儲 NULL
。
對於 TypeName
,不能使用復合數據類型 陣列 和 元組。復合數據類型可以包含 Nullable
類型值,例如Array(Nullable(Int8))
。
Nullable
類型字段不能包含在表索引中。
除非在 ClickHouse 服務器配置中另有說明,否則 NULL
是任何 Nullable
類型的默認值。
要在表的列中存儲 Nullable
類型值,ClickHouse 除了使用帶有值的普通文件外,還使用帶有 NULL
掩碼的單獨文件。 掩碼文件中的條目允許 ClickHouse 區分每個表行的 NULL
和相應數據類型的默認值。 由於附加了新文件,Nullable
列與類似的普通文件相比消耗額外的存儲空間。所以使用 Nullable
幾乎總是對性能產生負面影響,在設計數據庫時請記住這一點!
2.10:Array(T):數組
由 T 類型元素組成的數組。
T 可以是任意類型,包含數組類型。 但不推薦使用多維數組,ClickHouse 對多維數組的支持有限。
可以使用array()函數和中括號來創建數組
SELECT array(1, 2) SELECT [1, 2]
如果在元素中存在 NULL或存在 Nullable類型元素,那么數組的元素類型將會變成 Nullable。
如果 ClickHouse 無法確定數據類型,它將產生異常。
2.11:Tuple(T1,T2,...):元組
元組,其中每個元素都有單獨的類型。
SELECT tuple(1,'a')
2.12:Nested(Name1 Type1, Name2 Type2, ...):嵌套
嵌套數據結構類似於嵌套表。嵌套數據結構的參數(列名和類型)與 CREATE 查詢類似。每個表可以包含任意多行嵌套數據結構。
只支持一級嵌套。嵌套結構的列中,若列的類型是數組類型,那么該列其實和多維數組是相同的,所以目前嵌套層級的支持很局限(MergeTree 引擎中不支持存儲這樣的列)
大多數情況下,處理嵌套數據結構時,會指定一個單獨的列。為了這樣實現,列的名稱會與點號連接起來。這些列構成了一組匹配類型。在同一條嵌套數據中,所有的列都具有相同的長度。
不能對整個嵌套數據結構執行 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)