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

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, как и наUnderlying Numeric Values.

Значения Enum не могут быть сравнены с числами. Enums могут быть сравнены со строкой-константой. Если строка для сравнения не является допустимым значением для Enum, выбрасывается исключение. Оператор IN поддерживается с Enum с левой стороны и набором строк с правой стороны. Строки являются значениями соответствующего Enum.

Большинство числовых и строковых операций не определены для значений Enum, например, сложение числа с Enum или конкатенация строки с Enum. Тем не менее, Enum имеет естественную функцию toString, которая возвращает его строковое значение.

Значения Enum также могут быть преобразованы в числовые типы с использованием функции toT, где T - это числовой тип. Когда T соответствует основному числовому типу enum, это преобразование не требует затрат. Тип Enum может быть изменен без затрат с помощью ALTER, если только набор значений изменяется. Можно как добавлять, так и удалять члены Enum с помощью ALTER (удаление безопасно только в том случае, если удаляемое значение никогда не использовалось в таблице). В качестве меры предосторожности изменение числового значения ранее определенного члена Enum вызовет исключение.

С помощью ALTER можно изменить Enum8 на Enum16 или наоборот, так же как можно изменить Int8 на Int16.