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'
値となります。