ENUM
は、テーブルを作成する際カラム仕様の中で明確に列挙された許容値リストから選択された値を持つ文字列オブジェクトです。
列挙値は引用された文字列直定数である必要があります。これは、式でも、文字列値を評価するものでもありません。これは、ユーザ変数を列挙値として採用するべきではないという事も意味します。
その値は、特定の条件下では(''
)や
NULL
の空の文字列になる事もあります。
もし ENUM
に無効な値(許容値リストに存在しない文字列)を挿入すると、特別エラー値として空の文字列が代わりに挿入されます。この文字列は、ゼロの数値を持つという点で、「通常の」
空の文字列とは区別することができます。
この後でもう少し詳しく説明します。
もしストリクトSQLモードが有効なら、無効な
ENUM
値を挿入しようとするとエラーが発生します。
もし ENUM
カラムが
NULL
の許容を宣言すると、NULL
値はそのカラムにとって正当な値となり、デフォルト値は
NULL
になります。もし
ENUM
カラムが NOT
NULL
を宣言すると、許容値リストの最初の要素がそのデフォルト値となります。
それぞれの列挙値はインデックスを持ちます。
カラム仕様の中の許容可能エレメントリストからの値は1から始まる番号がつけられています。
空の文字列エラーインデックス値は0です。これは、どの無効な
ENUM
値に行が指定されたのかを見つける為に、次の
SELECT
ステートメントを利用する事ができるという事を意味します。
mysql> SELECT * FROM tbl_name
WHERE enum_col
=0;
NULL
値のインデックスは
NULL
です。
「インデックス」 という言葉は、列挙値リストの中の位置だけを表しています。これは、テーブルインデックスとは全く関係がありません。
例えば、ENUM('one', 'two',
'three')
として指定されたカラムはここに表されている値のどれでも持つ事ができます。それぞれの値のインデックスも表示されています。
値 | インデックス |
NULL |
NULL |
'' |
0 |
'one' |
1 |
'two' |
2 |
'three' |
3 |
1つの列挙は最大65,535エレメントを持つ事ができます。
テーブルが作成された時に、テーブル定義の中の
ENUM
メンバー値から後続スペースが自動的に削除されます。
検索された時は、ENUM
カラムに格納された値はカラム定義で使用されたレターケースで表示されます。ENUM
カラムは文字セットと照合に指定できる事を覚えて置いてください。バイナリ、またはケースに敏感な照合には、カラムに値を指定する時レターケースが考慮されます。
もし ENUM
値を数値コンテキストで検索するなら、カラム値のインデックスは返されます。例えば、このようにして
ENUM
カラムから数値を検索する事ができます。
mysql> SELECT enum_col
+0 FROM tbl_name
;
もし ENUM
カラムに数字を格納すると、その数字は可能値のインデックスとして扱われ、格納された値はそのインデックスを持つ列挙番号となります。(しかしこれは全ての入力を文字列として扱う
LOAD DATA
とは機能
しません。)もし数値が引用されると、列挙値リストの中に適合する文字列がなければ、そのままインデックスとして解釈されます。これらの理由により、ENUM
カラムを数字のように見える列挙値で定義する事は、複雑になり得るので
お勧めできません。例えば、次のカラムは
'0'
、'1'
、そして
'2'
の文字列値のある列挙番号を持ちますが、1
、2
、そして
3
の数値インデックス値は次のようになります。
numbers ENUM('0','1','2')
もし 2
を格納すると、それはインデックス値として解釈され、'1'
となります。 (インデックス2の値)もし
'2'
を格納すると、それは列挙値と適合するので
'2'
として格納されます。もし
'3'
を格納すると、どの列挙値とも適合しないのでインデックスとして扱われ、'2'
となります。 (インデックス3の値)
mysql>INSERT INTO t (numbers) VALUES(2),('2'),('3');
mysql>SELECT * FROM t;
+---------+ | numbers | +---------+ | 1 | | 2 | | 2 | +---------+
ENUM
値は、カラム仕様にリストされた列挙番号の順番に従ってソートされます。(言い換えると、ENUM
値はそれらのインデックス番号によってソートされるという事になります。)例えば、'a'
は ENUM('a', 'b')
では
'b'
の前にソートしますが、'b'
は ENUM('b', 'a')
では
'a'
の前にソートします。空の文字列は、空ではない文字列の前にソートし、そして
NULL
値はその他の全ての列挙値の前にソートします。予期しない結果を防ぐ為には、ENUM
リストをアルファベット順に指定してください。カラムがインデックス番号ではなく、語彙的にソートされる為に、GROUP
BY CAST(col AS CHAR)
か GROUP BY
CONCAT(col)
を利用する事もできます。
ENUM
カラムに有効な全ての値を究明したければ、SHOW
COLUMNS FROM
を利用し、アウトプットの tbl_name
LIKE
enum_col
Type
カラムの中の ENUM
定義を解析してください。