# 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](https://coordinatordb.com/docs/reference/data-types/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
```
