Enum
Перечисляемый тип, состоящий из именованных значений.
Именованные значения могут быть объявлены в виде пар 'строка' = целое число
или названий 'строка'
. ClickHouse хранит только числа, но поддерживает операции с значениями через их имена.
ClickHouse поддерживает:
- 8-битный
Enum
. Он может содержать до 256 значений, перечисленных в диапазоне[-128, 127]
. - 16-битный
Enum
. Он может содержать до 65536 значений, перечисленных в диапазоне[-32768, 32767]
.
ClickHouse автоматически выбирает тип Enum
, когда данные вставляются. Вы также можете использовать типы Enum8
или Enum16
, чтобы быть уверенными в размере хранилища.
Примеры использования
Здесь мы создаем таблицу с колонкой типа Enum8('hello' = 1, 'world' = 2)
:
Аналогично, вы можете опустить числа. ClickHouse автоматически назначит последовательные числа. Числа присваиваются начиная с 1 по умолчанию.
Вы также можете указать законное начальное число для первого имени.
Колонка x
может хранить только значения, перечисленные в определении типа: 'hello'
или 'world'
. Если вы попытаетесь сохранить любое другое значение, ClickHouse вызовет исключение. 8-битный размер для этого Enum
выбирается автоматически.
Когда вы запрашиваете данные из таблицы, ClickHouse выводит строковые значения из Enum
.
Если вам нужно увидеть числовые эквиваленты строк, вы должны привести значение Enum
к типу целого числа.
Чтобы создать значение Enum в запросе, вам также нужно использовать CAST
.
Общие правила и использование
Каждому из значений назначается число в диапазоне -128 ... 127
для Enum8
или в диапазоне -32768 ... 32767
для Enum16
. Все строки и числа должны быть различными. Пустая строка разрешена. Если этот тип указан (в определении таблицы), числа могут быть в произвольном порядке. Однако порядок не имеет значения.
Ни строковое, ни числовое значение в Enum
не может быть NULL.
Enum
может содержаться в типе Nullable. Так что, если вы создаете таблицу с помощью запроса
она может хранить не только 'hello'
и 'world'
, но и NULL
.
В ОЗУ колонка Enum
хранится так же, как Int8
или Int16
соответствующих числовых значений.
При чтении в текстовом формате ClickHouse парсит значение как строку и ищет соответствующую строку из набора значений Enum. Если она не найдена, выбрасывается исключение. При чтении в текстовом формате строка читается, и выполняется поиск соответствующего числового значения. Исключение будет выброшено, если оно не найдено. При записи в текстовом формате значение записывается как соответствующая строка. Если данные колонки содержат мусор (числа, которые не из допустимого набора), будет выброшено исключение. При чтении и записи в двоичном формате работает так же, как и для типов данных Int8 и Int16. Неявное значение по умолчанию — значение с наименьшим номером.
Во время ORDER BY
, GROUP BY
, IN
, DISTINCT
и так далее, Enums ведут себя так же, как соответствующие числа. Например, ORDER BY сортирует их численно. Операторы равенства и сравнения работают так же на Enums, как и на подлежащих числовых значениях.
Значения Enum не могут сравниваться с числами. Enums могут быть сравнены со строковой константой. Если строка, с которой сравнивается, не является допустимым значением для Enum, будет выброшено исключение. Оператор IN поддерживается с Enum с левой стороны и набором строк с правой стороны. Строки — это значения соответствующего Enum.
Большинство числовых и строковых операций не определены для значений Enum, например, сложение числа с Enum или конкатенация строки с Enum.
Тем не менее, Enum имеет естественную функцию toString
, которая возвращает его строковое значение.
Значения Enum также могут быть преобразованы в числовые типы с помощью функции toT
, где T — это числовой тип. Когда T соответствует подлежащему числовому типу перечисления, это преобразование не требует затрат.
Тип Enum может быть изменен без дополнительных затрат с помощью ALTER, если только набор значений не изменяется. Можно как добавлять, так и удалять элементы Enum с помощью ALTER (удаление безопасно только если удаляемое значение никогда не использовалось в таблице). В качестве меры предосторожности изменение числового значения ранее определенного элемента Enum вызовет исключение.
С помощью ALTER можно изменить Enum8 на Enum16 или наоборот, так же как и Int8 на Int16.