clickhouse数据类型

  1. 整型
    有符号整型:Int8, Int16, Int32, Int64
    无符号整型:UInt8, UInt16, UInt32, UInt64
  2. 浮点数(Float32, Float64)
    建议尽可能以整数形式存储数据。
    对浮点数进行计算可能引起四舍五入的误差。
    浮点计算结果可能是诸如正无穷大(inf)、负无穷大(-inf)和"非数字"(nan)。
SELECT 1 - 0.9 # 0.09999999999999998
SELECT 0.5 / 0 # inf
SELECT -0.5 / 0 # -inf
SELECT 0 / 0 # nan
  1. 有符号的定点数(Decimal(P, S), Decimal32(S), Decimal64(S), Decimal128(S))
    有符号的定点数,可在加、减和乘法运算过程中保持精度。对于除法,最低有效数字会被丢弃(不舍入)。
    P - 精度。有效范围:[1:38],决定可以有多少个十进制数字(包括分数)。
    S - 规模。有效范围:[0:P],决定数字的小数部分中包含的小数位数。
    在对 Decimal 类型执行操作时,数值可能会发生溢出。分数中的过多数字被丢弃(不是舍入的)。整数中的过多数字将导致异常。
    检查溢出会导致计算变慢。如果已知溢出不可能,则可以通过设置decimal_check_overflow来禁用溢出检查,在这种情况下,溢出将导致结果不正确:
  2. 布尔值
    没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1。
  3. 变长字符串(String)
    字符串可以任意长度的。它可以包含任意的字节集,包含空字节。
  4. 定长字符串(FixedString(N))
    固定长度 N 的字符串。N 必须是严格的正自然数。 当服务端读取长度小于 N 的字符串时候(例如解析 INSERT 数据时),通过在字符串末尾添加空字节来达到 N 字节长度。 当服务端读取长度大于 N 的字符串时候,将返回错误消息。 当服务器写入一个字符串(例如,当输出 SELECT 查询的结果)时,NULL字节不会从字符串的末尾被移除,而是被输出。
  5. 通用唯一标识符(UUID)
    通用唯一标识符(UUID)是用于标识记录的16字节数字。
    如果在插入新记录时未指定UUID列值,则UUID值将填充为零:00000000-0000-0000-0000-000000000000
    要生成UUID值,ClickHouse提供generateUUIDv4()函数。
select generateUUIDv4() # 29fc209d-eba3-4adf-b7cb-d4600036d10a

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

  1. 日期(Date)
    日期类型,用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值。
    最小值输出为0000-00-00。
  2. 时间戳(DateTime)
    时间戳类型。用四个字节(无符号的)存储 Unix 时间戳)。允许存储与日期类型相同的范围内的值。最小值为 0000-00-00 00:00:00。时间戳类型值精确到秒。
  3. 枚举类型(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)

你可能感兴趣的:(clickhouse数据类型)