UInt8,UInt16,UInt32,UInt64,Int8,Int16,Int32,Int64:
固定长度的整型,包括有符号整型或无符号整型
整型范围
* Int8-[-128:127]
* Int16-[-32768:32767]
* Int32-[-2147483648:2147483647]
* Int64-[-9223372036854775808:9223372036854775807]
无符号整型范围
* UInt8-[0:255]
* UInt16-[0:65535]
* UInt32-[0:4294967295]
* UInt64-[0:18446744073709551615]
Float32,Float64
浮点数
Float32 - float
Float64 - double
对浮点数进行计算可能引起四舍五入的误差
Decimal(P,S),Decimal32(S),Decimal64(S),Decimal128(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) )
内部表示方式
数据采用与自身位宽相同的有符号整数存储。这个数在内存中实际范围会高于上述范围,从 String 转换到十进制数的时候会做对应的检查。
由于现代CPU不支持128位数字,因此 Decimal128 上的操作由软件模拟。所以 Decimal128 的运算速度明显慢于 Decimal32/Decimal64。
运算和结果类型
对Decimal的二进制运算导致更宽的结果类型(无论参数的顺序如何)。
* Decimal64(S1) <op> Decimal32(S2) -> Decimal64(S)
* Decimal128(S1) <op> Decimal32(S2) -> Decimal128(S)
* Decimal128(S1) <op> Decimal64(S2) -> Decimal128(S)
精度变化的规则:
* 加法,减法:S = max(S1, S2)。
* 乘法:S = S1 + S2。
* 除法:S = S1。
对于 Decimal 和整数之间的类似操作,结果是与参数大小相同的十进制。
未定义Decimal和Float32/Float64之间的函数。要执行此类操作,您可以使用:toDecimal32、toDecimal64、toDecimal128 或 toFloat32,toFloat64,需要显式地转换其中一个参数。注意,结果将失去精度,类型转换是昂贵的操作。
Decimal上的一些函数返回结果为Float64(例如,var或stddev)。对于其中一些,中间计算发生在Decimal中。对于此类函数,尽管结果类型相同,但Float64和Decimal中相同数据的结果可能不同。
Boolean:
没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1
String:
字符串可以任意长度的。它可以包含任意的字节集,包含空字节。因此,字符串类型可以代替其他 DBMSs 中的 VARCHAR、BLOB、CLOB 等类型
ClickHouse 没有编码的概念。字符串可以是任意的字节集,按它们原本的方式进行存储和输出。
若需存储文本,建议使用 UTF-8 编码。至少,如果终端使用UTF-8(推荐),这样读写就不需要进行任何的转换了
Fixedstring:
固定长度 N 的字符串(N 必须是严格的正自然数)<column_name> FixedString(N)
当数据的长度恰好为N个字节时,FixedString类型是高效的。 在其他情况下,这可能会降低效率
UUID:
通用唯一标识符(UUID)是用于标识记录的16字节数
如果在插入新记录时未指定UUID列值,则UUID值将用零填充00000000-0000-0000-0000-000000000000
用法示例
限制
UUID数据类型仅支持以下功能 字符串 数据类型也支持(例如, min, max,和 计数).
算术运算不支持UUID数据类型(例如, abs)或聚合函数,例如 sum 和 avg
Date:
日期类型,用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值。允许存储从 Unix 纪元开始到编译阶段定义的上限阈值常量(目前上限是2106年,但最终完全支持的年份为2105)。最小值输出为1970-01-01
Datetime64:
允许存储时间instant间,可以表示为日历日期和一天中的时间,具有定义的亚秒精度。刻度尺寸(精度):10-精度 秒
语法:DateTime64(precision, [timezone])
在内部,存储数据作为一些 ‘ticks’ 自纪元开始(1970-01-01 00:00:00UTC)作为Int64. 刻度分辨率由precision参数确定。 此外,该 DateTime64 类型可以存储时区是相同的整个列,影响如何的值 DateTime64 类型值以文本格式显示,以及如何解析指定为字符串的值 (‘2020-01-01 05:00:01.000’). 时区不存储在表的行中(或resultset中),而是存储在列元数据中
用法示例:
Enum8,Enum16:
Enum 保存 'string'= integer 的对应关系。在 ClickHouse 中,尽管用户使用的是字符串常量,但所有含有 Enum 数据类型的操作都是按照包含整数的值来执行。这在性能方面比使用 String 数据类型更有效。
Enum8 用 'String'= Int8 对描述。
Enum16 用 'String'= Int16 对描述。
用法示例
LowCardinality Data Type:
把其它数据类型转变为字典编码类型 LowCardinality(data_type)
参数:data_type — String, FixedString, Date, DateTime,包括数字类型,但是Decimal除外。对一些数据类型来说,LowCardinality 并不高效,详查allow_suspicious_low_cardinality_types设置描述
LowCardinality 是一种改变数据存储和数据处理方法的概念。 ClickHouse会把 LowCardinality 所在的列进行dictionary coding。对很多应用来说,处理字典编码的数据可以显著的增加SELECT查询速度。
使用 LowCarditality 数据类型的效率依赖于数据的多样性。如果一个字典包含少于10000个不同的值,那么ClickHouse可以进行更高效的数据存储和处理。反之如果字典多于10000,效率会表现的更差。
当使用字符类型的时候,可以考虑使用 LowCardinality 代替Enum。 LowCardinality 通常更加灵活和高效
用法示例: