ClickHouse基本数据类型总结

1.什么是 ClickHouse ?

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。
也是是一个数据分析的数据库,列式存储数据。

2.ClickHouse 与其他数据库 性能对比

ClickHouse基本数据类型总结_第1张图片

3. ClickHouse的特性

  1. 完备的DBMS功能
  2. 列式存储与数据压缩
  3. 向量化执行引擎
  4. 关系模型与SQL查询
  5. 磁盘存储的数据
  6. 数据复制和对数据完整性的支持
  7. 实时数据更新

4.ClickHouse 支持的数据类型

1.整型
有符号整型:Int8, Int16, Int32, Int64
无符号整型:UInt8, UInt16, UInt32, UInt64
ClickHouse基本数据类型总结_第2张图片

2.浮点数
浮点数(Float32, Float64)
建议尽可能以整数形式存储数据。
对浮点数进行计算可能引起四舍五入的误差。
浮点计算结果可能是诸如正无穷大(inf)、负无穷大(-inf)和"非数字"(nan)。

3.有符号的浮点数

有符号的定点数(Decimal(P, S), Decimal32(S), Decimal64(S), Decimal128(S))
ClickHouse基本数据类型总结_第3张图片

4.变长字符串(String)
字符串可以任意长度的。它可以包含任意的字节,包含空字节。

5.定长字符串(FixedString(N))
固定长度 N 的字符串。N 必须是严格的正自然数。 当服务端读取长度小于 N 的字符串时候(例如解析 INSERT 数据时),通过在字符串末尾添加空字节来达到 N 字节长度。 当服务端读取长度大于 N 的字符串时候,将返回错误消息。 当服务器写入一个字符串(例如,当输出 SELECT 查询的结果)时,NULL字节不会从字符串的末尾被移除,而是被输出。

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

7.通用唯一标识符(UUID)
通用唯一标识符(UUID)是用于标识记录的16字节数字。
如果在插入新记录时未指定UUID列值,则UUID值将填充为零:00000000-0000-0000-0000-000000000000
要生成UUID值,ClickHouse提供generateUUIDv4()函数。

UUID数据类型不支持算术运算(例如,abs)或聚合函数(例如sum和avg)。
UUID数据类型仅支持String数据类型也支持的函数(例如,min,max和count)

8.日期(Date)
日期类型,用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值。
最小值输出为0000-00-00。

9.时间戳(DateTime)
时间戳类型。用四个字节(无符号的)存储 Unix 时间戳)。允许存储与日期类型相同的范围内的值。最小值为 0000-00-00 00:00:00。时间戳类型值精确到秒。

DateTime、DateTime64 和 Date
Date: 2020-02-02 精确到天
DateTime: 2020-02-02 20:20:20 精确到秒
DateTime64: 2020-02-02 20:20:20.335 精确到亚秒,可以设置精度
均支持字符串写入

clickhouse 的时间类型没有时间戳类型, 最高精度是 秒 所以如果需要处理毫秒、微秒精度的时间,则只能借助UInt类型实现。

10.枚举类型(Enum8, Enum16)
Enum 保存 ‘string’= integer 的对应关系。在 ClickHouse 中,尽管用户使用的是字符串常量,但所有含有 Enum 数据类型的操作都是按照包含整数的值来执行。这在性能方面比使用 String 数据类型更有效。
Enum8 用 ‘String’= Int8 对描述。
Enum16 用 ‘String’= Int16 对描述。

CREATE TABLE t_enum
(
    x Enum8('hello' = 1, 'world' = 2)
)
ENGINE = TinyLog
#
INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello')

这个 x 列只能存储类型定义中列出的值:‘hello’或’world’。如果您尝试保存任何其他值,ClickHouse 抛出异常。

  1. 数组(Array(T))
    由 T 类型元素组成的数组。
    T 可以是任意类型,包含数组类型。 但不推荐使用多维数组,ClickHouse 对多维数组的支持有限。
    可以使用array()函数和中括号来创建数组
SELECT array(1, 2)
SELECT [1, 2]

如果在元素中存在 NULL或存在 Nullable类型元素,那么数组的元素类型将会变成 Nullable。
如果 ClickHouse 无法确定数据类型,它将产生异常。

  1. 元组(Tuple(T1, T2, …))
    元组,其中每个元素都有单独的类型。
SELECT tuple(1,'a')

  1. 缺失值(Nullable(TypeName))
    允许用特殊标记NULL表示"缺失值",可以与 TypeName 的正常值存放一起。例如,Nullable(Int8) 类型的列可以存储 Int8 类型值,而没有值的行将存储 NULL。
    对于 TypeName,不能使用复合数据类型 Array和 Tuple。复合数据类型可以包含 Nullable 类型值,例如Array(Nullable(Int8))。
    Nullable 类型字段不能包含在表索引中。
    除非在 ClickHouse 服务器配置中另有说明,否则 NULL 是任何 Nullable 类型的默认值。
    使用 Nullable 几乎总是对性能产生负面影响。
 CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLog
#
INSERT INTO t_null VALUES (1, NULL)

  1. 嵌套(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)

  1. Nothing
    此数据类型的唯一目的是表示不是期望值的情况。 所以不能创建一个 Nothing 类型的值。
    例如,文本 NULL 的类型为 Nullable(Nothing)。

3.clickhouse 与mysql 数据类型对比

ClickHouse基本数据类型总结_第4张图片

参考: https://clickhouse.tech/docs/zh/engines/database-engines/mysql/

你可能感兴趣的:(clickhouse,doubleclick,基本数据类型)