一 :如何查看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 '
┌─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)