ClickHouse数据类型介绍
1.ClickHouse数据类型介绍
Mysql | Hive | ClickHouse |
---|---|---|
TINYINT | TINYINT | Int8 |
SMALLINT | SMALLINT | Int16 |
INT, MEDIUMINT | INT | Int32 |
BIGINT | BIGINT | Int64 |
VARCHAR | STRING | String |
DATETIME, TIMESTAMP | TIMESTAMP | DateTime |
FLOAT | FLOAT | Float32 |
DOUBLE | DOUBLE | Float64 |
BOOLEAN | BOOLEAN | 无 |
1.1 整形
Int8,Int16,Int32,Int64,UInt8,UInt16,UInt32,UInt64
固定长度的整型,包括有符号整型和无符号整型。
1.2 浮点型
建议尽可能以整数形式存储数据。例如,将固定精度的数字转换为整数值,如时间用毫秒为单位表示,因为浮点型进行计算时可能引起四舍五入的误差。
1.3 Decimal
Decimal(P,S),Decimal32(S),Decimal64(S),Decimal128(S)
有符号的定点数,可在加、减和乘法运算过程中保持精度。对于除法,最低有效数字会被丢弃(不舍入)。
参数:
P - 精度。有效范围:[1:38],决定可以有多少个十进制数字(包括分数)。
S - 规模。有效范围:[0:P],决定数字的小数部分中包含的小数位数。
对于不同的 P 参数值 Decimal 表示,以下例子都是同义的:
- P from [ 1 : 9 ] - for Decimal32(S)
- P from [ 10 : 18 ] - for Decimal64(S)
- P from [ 19 : 38 ] - for Decimal128(S)
- P from [ 39 : 76 ] - for Decimal256(S)
Decimal值范围
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。
内部表示方式:
数据采用与自身位宽相同的有符号整数存储。这个数在内存中实际范围会高于上述范围,从 String 转换到十进制数的时候会做对应的检查。
由于现代CPU不支持128位数字,因此 Decimal128 上的操作由软件模拟。所以 Decimal128 的运算速度明显慢于 Decimal32/Decimal64。
溢出检查 :
在 Decimal 的计算过程中,可能会发生整数溢出。 分数中过多的数字被丢弃(不是四舍五入)。 整数部分数字过多会导致异常。
SELECT toDecimal32(2, 4) AS x, x / 3;
SELECT toDecimal32(4.2, 8) AS x, x * x;
DB::Exception: Scale 16 is out of bounds: While processing toDecimal32(4.2, 8) AS x, x * x.
SELECT toDecimal32(4.2, 8) AS x, 6 * x;
DB::Exception: Decimal math overflow: While processing toDecimal32(4.2, 8) AS x, 6 * x.
溢出检查会导致操作变慢。 如果知道不可能发生溢出,则使用decimal_check_overflow 设置禁用检查是有意义的。 当检查被禁用并且发生溢出时,结果将是不正确的:
SET decimal_check_overflow = 0;
SELECT toDecimal32(4.2, 8) AS x, 6 * x;
溢出检查不仅发生在算术运算上,还发生在值的比较上:
SELECT toDecimal32(1, 8) < 100;
DB::Exception: Can't compare decimal number due to overflow: While processing toDecimal32(1, 8) < 100.
1.4 布尔值
没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1。
1.5 字符串
1)String
字符串可以任意长度的。它可以包含任意一组字节,包含空字节。String 类型替换了其他 DBMS 中的 VARCHAR、BLOB、CLOB 和其他类型。创建表时,可以设置字符串长度的参数(例如 VARCHAR(255)),但ClickHouse 会忽略它们。
2)FixedString(N)
固定长度 N 的字符串,N 必须是严格的正自然数。当服务端读取长度小于 N 的字符串时候,通过在字符串末尾添加空字节来达到 N 字节长度。当服务端读取长度大于 N 的字符串时候,将返回错误消息。
与String相比,极少会使用FixedString,因为使用起来不是很方便。
1.6 枚举
由命名值组成的枚举类型,命名值必须声明为 ‘string’ = 整数对。 ClickHouse 仅存储数字,但支持通过名称对值进行操作。
· Enum8 用 ‘String’= Int8 对描述,它最多可以包含在 [-128, 127] 范围内枚举的 256 个值
· Enum16 用 ‘String’= Int16 对描述,它最多可以包含在 [-32768, 32767] 范围内枚举的 65536 个值
使用示例:
CREATE TABLE t_enum( x Enum8('hello' = 1, 'world' = 2))ENGINE = TinyLog;
INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello')
select * from t_enum;
列 x 只能存储类型定义中列出的值:‘hello’ 或 ‘world’。 如果您尝试保存任何其他值,ClickHouse 将引发异常。
INSERT INTO t_enum values('a')
DB::Exception: Unknown element 'a' for type Enum('hello' = 1, 'world' = 2)
如果您需要查看行的等效数字,则必须将 Enum 值转换为整数类型
SELECT CAST(x, 'Int8') FROM t_enum;
1.7 数组 Array(t)
由 T 类型元素组成的数组。T 可以是任意类型,包含数组类型。 但不推荐使用多维数组,ClickHouse 对多维数组的支持有限。例如,不能存储在 MergeTree 表中存储多维数组。
可以使用array函数来创建数组,也可以使用方括号来创建数组:
SELECT array(1, 2) AS x, toTypeName(x);
SELECT [1, 2] AS x, toTypeName(x);
使用数据类型:
ClickHouse会自动检测数组元素,并根据元素计算出存储这些元素最小的数据类型。如果在元素中存在 NULL 或存在 Nullable 类型元素,那么数组的元素类型将会变成 Nullable 。
SELECT array(1, 2, NULL) AS x, toTypeName(x);
数组里面数据类型必须一致,否则会抛出异常,如:
SELECT array(1, 'a');
DB::Exception: There is no supertype for types UInt8, String because some of them are String/FixedString and some of them are not: While processing [1, 'a'].
1.8 元组
元素的元组,每个元素都有一个单独的类型。
SELECT tuple(1,'a') AS x, toTypeName(x);
元组中的数据类型:
在动态创建元组时,ClickHouse 会自动为元组的每一个参数赋予最小可表达的类型。如果参数为 NULL,那这个元组对应元素是 Nullable。
自动数据类型检测示例:
SELECT tuple(1, NULL) AS x, toTypeName(x);
1.9 Date
CREATE TABLE dt(`timestamp` Date,`event_id` UInt8)ENGINE = TinyLog;
INSERT INTO dt Values (1546300800, 1), ('2019-01-01', 2);
SELECT * FROM dt;
1.10 DateTime
CREATE TABLE dt(`timestamp` DateTime('Europe/Moscow'),`event_id` UInt8)ENGINE = TinyLog;
INSERT INTO dt Values (1546300800, 1), ('2019-01-01 00:00:00', 2);
SELECT * FROM dt;
1.11 低基数类型
把其它数据类型转变为字典编码类型。
语法:
LowCardinality(data_type)
参数:
data_type — String, FixedString, Date, DateTime
,包括数字类型,但是Decimal
除外。对一些数据类型来说,LowCardinality 并不高效。
创建一个 LowCardinality 类型的用列:
CREATE TABLE lc_t
(
`id` UInt16,
`strings` LowCardinality(String)
)
ENGINE = MergeTree()
ORDER BY id
其它更多的数据类型,请参考文档:ClickHouse数据类型