Перейти к основному содержимому
Перейти к основному содержимому

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.