ENUMおよびSETカラムによって、特定の値セットのみを含むカラムを効率的に定義することができます。項10.4.4. 「ENUM タイプ」
と 項10.4.5. 「SET タイプ」
を参照してください。ただし、MySQL
5.0.2以前では、ENUMおよびSETカラムは無効値の入力に対する実際の制約ではありません。
ENUMカラムには常にデフォルト値があります。デフォルトでない値を指定した場合、それはNULLを持ちうるカラムに対するNULLとなります。もしくは、
カラム定義における最初の列挙値となります。
ENUMカラムに正しくない値を挿入した場合、もしくはIGNOREを用いてENUMカラムにある値を強制した場合は、予約された列挙値0に設定され、文字列コンテキストでは空白文字列として表示されます。
SETカラムに正しくない値を挿入した場合、その値は無視されます。たとえば、カラムが'a'、'b'、そして'c'値を含む場合、'a,x,b,y'を割り当てようとすると'a,b'値になってしまいます。
MySQL
5.0.2以降では、厳格SQLモードを使用するためにサーバのコンフィギュレーションを行なうことができます。詳しくは
項4.2.6. 「SQL モード」
を参照してください。厳格モードを使用している場合、ENUMやSETカラムの定義は、カラム入力値の制約としては振舞いません。これらの条件を満たさない値に対しては、エラーが生じます。
ENUM値はカラム定義に一覧表示されているものか、もしくはそれについて同等の内部数値でなければなりません。その値はエラー値(つまり、0または空白文字列)にはなりえません。ENUM('a','b','c')として定義されるカラムに対して、''、'd'または'ax'といった値は無効であり、かつ拒絶されます。
SET値は空白文字列、もしくはコンマで区切られたカラム定義に挙げられている値のみで構成された値でなければなりません。SET('a','b','c')として定義されるカラムにとって、'd'または'a,b,c,d'といった値は無効であり、かつ拒絶されます。
無効値に対するエラーは、INSERT
IGNOREやUPDATE
IGNOREを使用している場合、厳格モードで抑制されます。この場合、エラーではなく警告が発せられます。ENUMに対しては、その値はエラーメンバー(0)として挿入されます。SETに対しては、どの無効部分文字列も消去されるという点を除いて、その値は既存のものとして挿入されます。たとえば、'a,x,b,y'は'a,b'値となります。
