ENUM 型は、テーブルの作成時にカラムの仕様で明示的に列挙された使用可能な値のリストから、通常、値が選択される文字列オブジェクトです。
次に示すように、一定の状況では、空の文字列("")または NULL も値として使用できます。
不正な値(使用可能な値のリストに含まれない文字列)を ENUM 型のカラムに挿入すると、特殊なエラー値として、空の文字列が挿入される。この文字列は数値 0 を持つため、'通常' の空の文字列とは区別することができる(これについては後述)。
ENUM 型が NULL として宣言されている場合、そのカラムでは NULL も正しい値となり、デフォルト値は NULL になる。ENUM 型が NOT NULL として宣言されている場合は、使用可能な値の最初の要素がデフォルト値として使用される。
次に示すように、各列挙値にはインデックスを付けることができる。
カラムの仕様の使用可能な要素のリストに含まれる値は 1 から順に番号付けされる。
空の文字列エラー値のインデックス値は 0。したがって、次の SELECT ステートメントでは、無効な ENUM が割り当てられているレコードを検索できる。
mysql> SELECT * FROM tbl_name WHERE enum_col=0;
NULL 値のインデックスは NULL。
たとえば、ENUM("one", "two", "three") として指定されたカラムの場合、次の値のいずれかを取ります。それぞれの値では、対応するインデックスも示しています。
| 値 | インデックス |
NULL | NULL |
"" | 0 |
"one" | 1 |
"two" | 2 |
"three" | 3 |
列挙には、最大 65535 個の要素を組み込むことができます。
3.23.51 以降、ENUM 値の後続のスペースはテーブルの作成時に自動で削除されます。
ENUM 型のカラムに値を割り当てる際には、大文字と小文字の区別はありません。その後、カラムから取り出される値では、大文字と小文字が区別されます。この区別は、テーブルの作成時に使用可能な値として指定された値に基づいて決まります。
ENUM 型の値を数値のコンテキストで取り出すと、そのカラム値のインデックスが返されます。たとえば、ENUM 型のカラムから次のような数値を取り出すことができます。
mysql> SELECT enum_col+0 FROM tbl_name;
ENUM 型のカラムに数値を格納すると、その数値はインデックスとして扱われ、そのインデックスを持つ列挙要素が値として格納されます(ただし、LOAD DATA においては異なり、すべての入力が文字列として扱われます)。
まぎらわしいので、ENUM 型の文字列には数値を含めないようにしてください。
ENUM 型の値は、カラムの仕様で列挙要素がリストされたときの順序にもとづいてソートされます(つまり、ENUM はインデックス番号順にソートされます)。たとえば、ENUM("a", "b") の場合、"a" は "b" の前にソートされますが、ENUM("b", "a") の場合は、"b" が "a" の前にソートされます。空の文字列は空以外の文字列の前にソートされ、NULL 値はその他すべての列挙値の前にソートされます。
予期しない結果が起こらないよう、ENUM リストはアルファベット順に指定するようにします。また、
GROUP BY CONCAT(col) を使用して、カラムがインデックス番号順ではなく、アルファベット順に確実にソートされるようにすることもできます。
ENUM 型のカラムの使用可能なすべての値が必要な場合は、SHOW COLUMNS FROM table_name LIKE enum_column_name を使用し、2 番目のカラムで ENUM 定義を解析します。