ClickHouse数据类型介绍

ClickHouse数据类型介绍

1.ClickHouse数据类型介绍

MysqlHiveClickHouse
TINYINTTINYINTInt8
SMALLINTSMALLINTInt16
INT, MEDIUMINTINTInt32
BIGINTBIGINTInt64
VARCHARSTRINGString
DATETIME, TIMESTAMPTIMESTAMPDateTime
FLOATFLOATFloat32
DOUBLEDOUBLEFloat64
BOOLEANBOOLEAN

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数据类型

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值