Enum8,Enum16

    • Enum8'String'= Int8 对描述。
    • Enum16'String'= Int16 对描述。

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

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

    1. :) INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello')
    2. INSERT INTO t_enum VALUES
    3. Ok.
    4. 3 rows in set. Elapsed: 0.002 sec.
    5. :) insert into t_enum values('a')
    6. Exception on client:
    7. Code: 49. DB::Exception: Unknown element 'a' for type Enum8('hello' = 1, 'world' = 2)

    当您从表中查询数据时,ClickHouse 从 Enum 中输出字符串值。

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

    1. ┌─CAST(x, 'Int8')─┐
    2. 1
    3. 2
    4. 1
    5. └─────────────────┘

    在查询中创建枚举值,您还需要使用 CAST

    规则及用法

    Enum 中的字符串和数值都不能是 。

    Enum 包含在 可为空 类型中。因此,如果您使用此查询创建一个表

    1. CREATE TABLE t_enum_nullable
    2. (
    3. x Nullable( Enum8('hello' = 1, 'world' = 2) )
    4. ENGINE = TinyLog

    不仅可以存储 'hello''world' ,还可以存储 NULL

    在内存中,Enum 列的存储方式与相应数值的 Int8Int16 相同。

    当以文本方式读取的时候,ClickHouse 将值解析成字符串然后去枚举值的集合中搜索对应字符串。如果没有找到,会抛出异常。当读取文本格式的时候,会根据读取到的字符串去找对应的数值。如果没有找到,会抛出异常。

    隐式默认值是数值最小的值。

    ORDER BYGROUP BYINDISTINCT 等等中,Enum 的行为与相应的数字相同。例如,按数字排序。对于等式运算符和比较运算符,Enum 的工作机制与它们在底层数值上的工作机制相同。

    枚举值不能与数字进行比较。枚举可以与常量字符串进行比较。如果与之比较的字符串不是有效Enum值,则将引发异常。可以使用 IN 运算符来判断一个 Enum 是否存在于某个 Enum 集合中,其中集合中的 Enum 需要用字符串表示。

    大多数具有数字和字符串的运算并不适用于Enums;例如,Enum 类型不能和一个数值相加。但是,Enum有一个原生的 toString 函数,它返回它的字符串值。

    Enum 值使用 toT 函数可以转换成数值类型,其中 T 是一个数值类型。若 T 恰好对应 Enum 的底层数值类型,这个转换是零消耗的。

    通过 ALTER 操作,可以将 Enum8 转成 Enum16,反之亦然,就像 Int8Int16一样。