Tipo enumerado compuesto por valores con nombre.
Los valores con nombre pueden declararse como pares 'string' = integer o como nombres 'string'. ClickHouse solo almacena números, pero permite operar con los valores a través de sus nombres.
ClickHouse admite:
Enum de 8 bits. Puede contener hasta 256 valores enumerados en el intervalo [-128, 127].
Enum de 16 bits. Puede contener hasta 65536 valores enumerados en el intervalo [-32768, 32767].
ClickHouse elige automáticamente el tipo de Enum al insertar los datos. También puede usar los tipos Enum8 o Enum16 para asegurarse del tamaño de almacenamiento.
Aquí se crea una tabla con una columna de tipo Enum8('hello' = 1, 'world' = 2):
CREATE TABLE t_enum
(
x Enum('hello' = 1, 'world' = 2)
)
ENGINE = TinyLog
Asimismo, puedes omitir los números. ClickHouse asignará automáticamente números consecutivos. De forma predeterminada, los números se asignan a partir de 1.
CREATE TABLE t_enum
(
x Enum('hello', 'world')
)
ENGINE = TinyLog
También puedes especificar un número inicial permitido para el primer nombre.
CREATE TABLE t_enum
(
x Enum('hello' = 1, 'world')
)
ENGINE = TinyLog
CREATE TABLE t_enum
(
x Enum8('hello' = -129, 'world')
)
ENGINE = TinyLog
Exception on server:
Code: 69. DB::Exception: Value -129 for element 'hello' exceeds range of Enum8.
La columna x solo puede almacenar valores incluidos en la definición del tipo: 'hello' o 'world'. Si intenta guardar cualquier otro valor, ClickHouse generará una excepción. El tamaño de 8 bits para este Enum se elige automáticamente.
INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello')
INSERT INTO t_enum VALUES('a')
Exception on client:
Code: 49. DB::Exception: Unknown element 'a' for type Enum('hello' = 1, 'world' = 2)
Cuando consultas datos de la tabla, ClickHouse muestra los valores de texto de Enum.
┌─x─────┐
│ hello │
│ world │
│ hello │
└───────┘
Si necesita ver los equivalentes numéricos de las filas, debe convertir el valor Enum a un tipo entero.
SELECT CAST(x, 'Int8') FROM t_enum
┌─CAST(x, 'Int8')─┐
│ 1 │
│ 2 │
│ 1 │
└─────────────────┘
Para crear un valor de tipo Enum en una consulta, también debes usar CAST.
SELECT toTypeName(CAST('a', 'Enum(\'a\' = 1, \'b\' = 2)'))
┌─toTypeName(CAST('a', 'Enum(\'a\' = 1, \'b\' = 2)'))─┐
│ Enum8('a' = 1, 'b' = 2) │
└─────────────────────────────────────────────────────┘
A cada uno de los valores se le asigna un número en el intervalo -128 ... 127 para Enum8 o en el intervalo -32768 ... 32767 para Enum16. Todas las cadenas y todos los números deben ser diferentes. Se permite una cadena vacía. Si se especifica este tipo (en una definición de tabla), los números pueden estar en cualquier orden. Sin embargo, el orden no importa.
Ni la cadena ni el valor numérico de un Enum pueden ser NULL.
Un Enum puede estar contenido en el tipo Nullable. Por lo tanto, si crea una tabla usando la consulta
CREATE TABLE t_enum_nullable
(
x Nullable( Enum8('hello' = 1, 'world' = 2) )
)
ENGINE = TinyLog
puede almacenar no solo 'hello' y 'world', sino también NULL.
INSERT INTO t_enum_nullable VALUES('hello'),('world'),(NULL)
En RAM, una columna Enum se almacena de la misma forma que Int8 o Int16 con los valores numéricos correspondientes.
Al leer en formato de texto, ClickHouse interpreta el valor como una cadena y busca la cadena correspondiente en el conjunto de valores del Enum. Si no la encuentra, se genera una excepción. Al leer en formato de texto, se lee la cadena y se busca el valor numérico correspondiente. Si no se encuentra, se generará una excepción.
Al escribir en formato de texto, escribe el valor como la cadena correspondiente. Si los datos de la columna contienen valores no válidos (números que no pertenecen al conjunto válido), se genera una excepción. Al leer y escribir en formato binario, funciona igual que con los tipos de datos Int8 e Int16.
El valor predeterminado implícito es el valor con el número más bajo.
Durante ORDER BY, GROUP BY, IN, DISTINCT, etc., los Enum se comportan igual que los números correspondientes. Por ejemplo, ORDER BY los ordena numéricamente. Los operadores de igualdad y comparación funcionan con los Enum igual que con los valores numéricos subyacentes.
Los valores Enum no pueden compararse con números. Los Enum pueden compararse con una cadena constante. Si la cadena con la que se comparan no es un valor válido para el Enum, se generará una excepción. El operador IN es compatible cuando el Enum está en el lado izquierdo y un conjunto de cadenas en el lado derecho. Las cadenas son los valores del Enum correspondiente.
La mayoría de las operaciones numéricas y con cadenas no están definidas para los valores Enum; por ejemplo, sumar un número a un Enum o concatenar una cadena a un Enum.
Sin embargo, el Enum tiene una función toString nativa que devuelve su valor en cadena.
Los valores Enum también pueden convertirse a tipos numéricos mediante la función toT, donde T es un tipo numérico. Cuando T corresponde al tipo numérico subyacente del Enum, esta conversión no tiene coste.
El tipo Enum puede cambiarse sin coste mediante ALTER si solo se modifica el conjunto de valores. Es posible tanto añadir como eliminar miembros del Enum mediante ALTER (eliminarlos es seguro solo si el valor eliminado nunca se ha usado en la tabla). Como medida de seguridad, cambiar el valor numérico de un miembro del Enum definido previamente generará una excepción.
Con ALTER, es posible cambiar un Enum8 por un Enum16 o viceversa, igual que al cambiar un Int8 por un Int16. Última modificación el 10 de junio de 2026