ClickHouse/docs/zh/data_types/enum.md

35 lines
2.6 KiB
Markdown
Raw Normal View History

# Enum
`Enum8` 或者 `Enum16`。 一组有限的字符串值,比 `String` 类型的存储更加有效。
示例:
```text
Enum8('hello' = 1, 'world' = 2)
```
- 一个类型可以表示两个值: 'hello' and 'world'。
`Enum8` 类型的每个值范围是 `-128 ... 127``Enum16` 类型的每个值范围是 `-32768 ... 32767`。所有的字符串或者数字都必须是不一样的。允许存在空字符串。如果某个 Enum 类型被指定了(在表定义的时候),数字可以是任意顺序。然而,顺序并不重要。
(译者注:如 `Enum8('he o' = 3, 'wld' = 1)` 也是合法的)
在内存中Enum 类型当做 `Int8` or `Int16` 对应的数值来存储。
当以文本方式读取的时候ClickHouse 将值解析成字符串然后去 Enum 值的集合中搜索对应字符串。如果没有找到,会抛出异常。当读取文本格式的时候,会根据读取到的字符串去找对应的数值。如果没有找到,会抛出异常。
当以文本方式写入的时候ClickHouse 将值解析成字符串写入。如果 column 数据包含垃圾不是从有用集合含有的数值会抛弃异常。Enum 类型以二进制读取和写入的方式与 Int8 和 Int16 类型一样的。
隐式默认值是对应类型的最小值。
`ORDER BY`, `GROUP BY`, `IN`, `DISTINCT`Enums 和对应数值是一样的工作方式。比如, ORDER BY 会将它们按数值排序。对 Enums 类型使用相同和比较操作符都与操作它们隐含的数值是一样的。
Enum 值不能和数值比较大小。Enums 可以和一个常量字符串比较大小。如果字符串不是一个可用的 Enum 值,会抛出异常。可以使用 IN 运算符来判断一个 Enum 是否存在于某个 Enum 集合中,其中集合中的 Enum 需要用字符串表示。
大部分数字运算和字符串运算都没有给 Enum 类型定义比如Enum 类型不能和一个数相加,或进行字符串连接的操作,但是可以通过 toString 方法返回它对应的字符串。
Enum 值使用 `toT` 函数可以转换成数值类型,其中 T 是一个数值类型。若 `T` 恰好对应 Enum 的底层数值类型,这个转换是零消耗的。
Enum 类型可以被 `ALTER` 无成本地修改对应集合的值。可以通过 `ALTER` 操作来增加或删除 Enum 的成员(只要表没有用到该值,删除都是安全的)。作为安全保障,改变之前使用过的 Enum 成员将抛出异常。
通过 `ALTER` 操作,可以将 `Enum8` 转成 `Enum16`,反之亦然,就像 `Int8``Int16`一样。
[来源文章](https://clickhouse.yandex/docs/en/data_types/enum/) <!--hide-->