'string' = integer のペア、または 'string' の名前として宣言できます。ClickHouse に保存されるのは数値のみですが、値は名前を通して操作できます。
ClickHouse では以下をサポートしています。
- 8 ビットの
Enum。[-128, 127]の範囲で列挙される最大 256 個の値を含めることができます。 - 16 ビットの
Enum。[-32768, 32767]の範囲で列挙される最大 65536 個の値を含めることができます。
Enum の型を自動的に選択します。保存サイズを明示的に指定したい場合は、Enum8 または Enum16 型を使用することもできます。
使用例
Enum8('hello' = 1, 'world' = 2) 型のカラムを持つテーブルを作成します。
x には、型定義に列挙されている値 'hello' または 'world' しか格納できません。これ以外の値を保存しようとすると、ClickHouse で例外が発生します。この Enum には 8 ビットのサイズが自動的に選択されます。
Enum の文字列値を出力します。
Enum の値を整数型にキャストする必要があります。
CASTも使用する必要があります。
一般的なルールと使用法
Enum8 の場合は -128 ... 127、Enum16 の場合は -32768 ... 32767 の範囲内の数値が割り当てられます。文字列と数値は、いずれもすべて一意でなければなりません。空文字列は使用できます。この型が指定されている場合 (テーブル定義内) 、数値の順序は任意です。ただし、その順序自体に意味はありません。
Enum では、文字列にも数値にも NULL を指定できません。
Enum は Nullable 型に含めることもできます。したがって、クエリを使ってテーブルを作成する場合
'hello' や 'world' だけでなく、NULL も格納できます。
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 に、またはその逆に変更できます。