> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8c05c8a2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> 名前付き定数値の集合を表す、ClickHouse の Enum データ型に関するドキュメント

# Enum

名前付きの値からなる列挙型です。

名前付きの値は、`'string' = integer` のペア、または `'string'` の名前として宣言できます。ClickHouse に保存されるのは数値のみですが、値は名前を通して操作できます。

ClickHouse では以下をサポートしています。

* 8 ビットの `Enum`。`[-128, 127]` の範囲で列挙される最大 256 個の値を含めることができます。
* 16 ビットの `Enum`。`[-32768, 32767]` の範囲で列挙される最大 65536 個の値を含めることができます。

データの挿入時に、ClickHouse は `Enum` の型を自動的に選択します。保存サイズを明示的に指定したい場合は、`Enum8` または `Enum16` 型を使用することもできます。

<div id="usage-examples">
  ## 使用例
</div>

ここでは、`Enum8('hello' = 1, 'world' = 2)` 型のカラムを持つテーブルを作成します。

```sql theme={null}
CREATE TABLE t_enum
(
    x Enum('hello' = 1, 'world' = 2)
)
ENGINE = TinyLog
```

同様に、番号は省略することもできます。ClickHouse が連番を自動的に割り当てます。番号はデフォルトで 1 から順に割り当てられます。

```sql theme={null}
CREATE TABLE t_enum
(
    x Enum('hello', 'world')
)
ENGINE = TinyLog
```

最初の名前の開始番号として、有効な値を指定することもできます。

```sql theme={null}
CREATE TABLE t_enum
(
    x Enum('hello' = 1, 'world')
)
ENGINE = TinyLog
```

```sql theme={null}
CREATE TABLE t_enum
(
    x Enum8('hello' = -129, 'world')
)
ENGINE = TinyLog
```

```text theme={null}
Exception on server:
Code: 69. DB::Exception: Value -129 for element 'hello' exceeds range of Enum8.
```

カラム `x` には、型定義に列挙されている値 `'hello'` または `'world'` しか格納できません。これ以外の値を保存しようとすると、ClickHouse で例外が発生します。この `Enum` には 8 ビットのサイズが自動的に選択されます。

```sql theme={null}
INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello')
```

```text theme={null}
Ok.
```

```sql theme={null}
INSERT INTO t_enum VALUES('a')
```

```text theme={null}
Exception on client:
Code: 49. DB::Exception: Unknown element 'a' for type Enum('hello' = 1, 'world' = 2)
```

テーブルのデータをクエリすると、ClickHouse は `Enum` の文字列値を出力します。

```sql theme={null}
SELECT * FROM t_enum
```

```text theme={null}
┌─x─────┐
│ hello │
│ world │
│ hello │
└───────┘
```

行の数値上の対応を確認する必要がある場合は、`Enum` の値を整数型にキャストする必要があります。

```sql theme={null}
SELECT CAST(x, 'Int8') FROM t_enum
```

```text theme={null}
┌─CAST(x, 'Int8')─┐
│               1 │
│               2 │
│               1 │
└─────────────────┘
```

クエリ内でEnumの値を作成するには、`CAST`も使用する必要があります。

```sql theme={null}
SELECT toTypeName(CAST('a', 'Enum(\'a\' = 1, \'b\' = 2)'))
```

```text theme={null}
┌─toTypeName(CAST('a', 'Enum(\'a\' = 1, \'b\' = 2)'))─┐
│ Enum8('a' = 1, 'b' = 2)                             │
└─────────────────────────────────────────────────────┘
```

<div id="general-rules-and-usage">
  ## 一般的なルールと使用法
</div>

各値には、`Enum8` の場合は `-128 ... 127`、`Enum16` の場合は `-32768 ... 32767` の範囲内の数値が割り当てられます。文字列と数値は、いずれもすべて一意でなければなりません。空文字列は使用できます。この型が指定されている場合 (テーブル定義内) 、数値の順序は任意です。ただし、その順序自体に意味はありません。

`Enum` では、文字列にも数値にも [NULL](/ja/reference/syntax) を指定できません。

`Enum` は [Nullable](/ja/reference/data-types/nullable) 型に含めることもできます。したがって、クエリを使ってテーブルを作成する場合

```sql theme={null}
CREATE TABLE t_enum_nullable
(
    x Nullable( Enum8('hello' = 1, 'world' = 2) )
)
ENGINE = TinyLog
```

これには `'hello'` や `'world'` だけでなく、`NULL` も格納できます。

```sql theme={null}
INSERT INTO t_enum_nullable VALUES('hello'),('world'),(NULL)
```

RAM 内では、`Enum` カラムは、対応する数値の `Int8` または `Int16` と同じ方法で格納されます。

テキスト形式で読み取る場合、ClickHouse は値を文字列としてパースし、Enum 値の集合から対応する文字列を検索します。見つからない場合は例外がスローされます。テキストフォーマットで読み取る場合は、文字列を読み取り、対応する数値を検索します。見つからない場合は例外がスローされます。
テキスト形式で書き込む場合は、値を対応する文字列として書き込みます。カラムデータに不正な値 (有効な集合に含まれない数値) が含まれている場合は、例外がスローされます。バイナリ形式での読み書きは、Int8 および Int16 データ型の場合と同じように動作します。
暗黙のデフォルト値は、最も小さい数値に対応する値です。

`ORDER BY`、`GROUP BY`、`IN`、`DISTINCT` などでは、Enum は対応する数値と同じように振る舞います。たとえば、ORDER BY では数値順にソートされます。等価演算子および比較演算子は、Enum に対しても基になる数値と同じように機能します。

Enum 値は数値とは比較できません。Enum は定数文字列とは比較できます。比較対象の文字列がその Enum の有効な値でない場合は、例外がスローされます。IN 演算子は、左辺に Enum、右辺に文字列の集合を置く形でサポートされています。これらの文字列は、対応する Enum の値です。

ほとんどの数値演算および文字列演算は、Enum 値に対して定義されていません。たとえば、Enum に数値を加算したり、Enum に文字列を連結したりすることはできません。
ただし、Enum には文字列値を返す組み込みの `toString` 関数があります。

Enum 値は、T を数値型とする `toT` 関数を使って数値型に変換することもできます。T が enum の基になる数値型に対応している場合、この変換のコストはゼロです。
値の集合だけを変更するのであれば、Enum 型は ALTER を使ってコストなしで変更できます。ALTER を使うことで、Enum のメンバーを追加することも削除することも可能です (削除は、その削除する値がそのテーブルで一度も使用されていない場合にのみ安全です) 。安全策として、以前に定義された Enum メンバーの数値を変更すると例外がスローされます。

ALTER を使用すると、Int8 を Int16 に変更する場合と同様に、Enum8 を Enum16 に、またはその逆に変更できます。

<div id="add-enum-values">
  ## ENUM値を追加
</div>

ALTER [MODIFY COLUMN ADD ENUM VALUES](/ja/reference/statements/alter/column#modify-column-add-enum-values) を使って enum に新しい値を追加するための糖衣構文があります。

```sql theme={null}
CREATE TABLE enum
(
    x Enum('One' = 1, 'Two', 'Three')
) ENGINE = Memory;
ALTER TABLE enum MODIFY COLUMN x ADD ENUM VALUES ('Zero' = 0, 'Four' = 4);
SHOW CREATE TABLE enum;
```

```text theme={null}
┌─statement────────────────────────────────────────────────────────────────┐
│CREATE TABLE default.enum                                                 │
│(                                                                         │
│    `x` Enum8('Zero' = 0, 'One' = 1, 'Two' = 2, 'Three' = 3, 'Four' = 4)  │
│)                                                                         │
│ENGINE = Memory                                                           │
└──────────────────────────────────────────────────────────────────────────┘
```
