ClickHouse基础知识(三):ClickHouse 数据类型全解

1 整型

固定长度的整型,包括有符号整型或无符号整型。

整型范围(-2n-1~2n-1-1):

无符号整型范围(0~2n-1):

使用场景: 个数、数量、也可以存储型 id。

2 浮点型

Float32 - float

Float64 -- double

建议尽可能以整数形式存储数据。例如,将固定精度的数字转换为整数值,如时间用毫秒为单位表示,因为浮点型进行计算时可能引起四舍五入的误差。

使用场景:一般数据值比较小,不涉及大量的统计计算,精度要求不高的时候。比如 保存商品的重量。

3 布尔型

没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1。

4 Decimal 型

有符号的浮点数,可在加、减和乘法运算过程中保持精度。对于除法,最低有效数字会 被丢弃(不舍入)。

有三种声明: 括号里面表示小数位

➢ Decimal32(s),相当于 Decimal(9-s,s),有效位数为 1~9

➢ Decimal64(s),相当于 Decimal(18-s,s),有效位数为 1~18

➢ Decimal128(s),相当于 Decimal(38-s,s),有效位数为 1~38

s 标识小数位

使用场景: 一般金额字段、汇率、利率等字段为了保证小数点精度,都使用 Decimal 进行存储。

5 字符串

1)String

字符串可以任意长度的。它可以包含任意的字节集,包含空字节。

2)FixedString(N)

固定长度 N 的字符串,N 必须是严格的正自然数。当服务端读取长度小于 N 的字符 串时候,通过在字符串末尾添加空字节来达到 N 字节长度。 当服务端读取长度大于 N 的 字符串时候,将返回错误消息。

与 String 相比,极少会使用 FixedString,因为使用起来不是很方便。

使用场景:名称、文字描述、字符型编码。 固定长度的可以保存一些定长的内容,比 如一些编码,性别等但是考虑到一定的变化风险,带来收益不够明显,所以定长字符串使用 意义有限。

6 枚举类型

包括 Enum8 和 Enum16 类型。Enum 保存 'string'= integer 的对应关系。

Enum8 用 'String'= Int8 对描述。

Enum16 用 'String'= Int16 对描述。

1)用法演示

创建一个带有一个枚举 Enum8('hello' = 1, 'world' = 2) 类型的列

复制代码
CREATE TABLE t_enum
(
 x Enum8('hello' = 1, 'world' = 2)
)
ENGINE = TinyLog;

2)这个 x 列只能存储类型定义中列出的值:'hello'或'world'

复制代码
hadoop102 :) INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello');

3)如果尝试保存任何其他值,ClickHouse 抛出异常

复制代码
 hadoop102 :) insert into t_enum values('a')

4)如果需要看到对应行的数值,则必须将 Enum 值转换为整数类型

复制代码
 hadoop102 :) SELECT CAST(x, 'Int8') FROM t_enum;

使用场景:对一些状态、类型的字段算是一种空间优化,也算是一种数据约束。但是实 际使用中往往因为一些数据内容的变化增加一定的维护成本,甚至是数据丢失问题。所以谨慎使用。

7 时间类型

目前 ClickHouse 有三种时间类型

➢ Date 接受年-月-日的字符串比如 '2019-12-16'

➢ Datetime 接受年-月-日 时:分:秒的字符串比如 '2019-12-16 20:50:10'

➢ Datetime64 接受年-月-日 时:分:秒.亚秒 的字符串比如'2019-12-16 20:50:10.66'

日期类型,用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值。

还有很多数据结构,可以参考官方文档:https://clickhouse.yandex/docs/zh/data_types/

8 数组

Array(T):由 T 类型元素组成的数组。

T 可以是任意类型,包含数组类型。 但不推荐使用多维数组,ClickHouse 对多维数组 的支持有限。例如,不能在 MergeTree 表中存储多维数组。

(1)创建数组方式 1,使用 array 函数

复制代码
array(T)
hadoop102 :) SELECT array(1, 2) AS x, toTypeName(x) ;

(2)创建数组方式 2:使用方括号

复制代码
[]
hadoop102 :) SELECT [1, 2] AS x, toTypeName(x);
相关推荐
广州智造1 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
技术宝哥4 小时前
Redis(2):Redis + Lua为什么可以实现原子性
数据库·redis·lua
学地理的小胖砸5 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1235 小时前
Redis解析
数据库·redis·缓存
数据库幼崽6 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd6 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou6 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh7 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵8 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多9 小时前
Linux——mysql主从复制与读写分离
数据库·mysql