Skip to content

Enum8 and Enum16 ​

An Enum defines a fixed mapping between text labels and signed integer codes. Queries display the labels; comparison, grouping and sorting use the declared codes.

Use an Enum when the admitted labels form a known vocabulary, such as a job status. Use String when new labels should be accepted without a schema declaration.

Syntax ​

text
Enum8('label' = code, ...)
Enum16('label' = code, ...)
Enum('label', ...)

Labels are case-sensitive and must be unique. Codes must also be unique. Enum8 accepts codes from -128 through 127; Enum16 accepts -32768 through 32767. Enum selects the smallest supported width containing all codes.

Omitted codes are assigned in declaration order, beginning at 1; a code after an explicit code continues from that value.

General Rules and Usage ​

Writes accept declared labels or declared numeric codes. An unknown label or undeclared code is rejected. A numeric cast exposes the code; ordinary query output shows its label.

Two values from different Enum definitions compare equal only when both code and label agree. The type's implicit default is its lowest declared code. A column can still contain SQL NULL unless it declares NOT NULL.

Usage Examples ​

Job statuses ​

sql
CREATE TABLE jobs
(
    id UInt32,
    status Enum8('pending' = 1, 'running' = 2, 'done' = 3) DEFAULT 'pending'
);
INSERT INTO jobs(id) VALUES (1);
INSERT INTO jobs VALUES (2, 'done');
sql
SELECT id, status, CAST(status AS Int8) AS code
FROM jobs
ORDER BY status
FORMAT csv;
text
1,"pending",1
2,"done",3

Automatic numbering ​

sql
SELECT CAST(CAST('medium' AS Enum('low', 'medium', 'high')) AS Int8)
FORMAT csv;
text
2