ENUM
および SET
カラムによって、特定の値セットのみを含むカラムを効率的に定義することができます。セクション11.4.4「ENUM 型」およびセクション11.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 モードを使用するようにサーバーを構成できます。セクション5.1.7「サーバー 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'
の値となります。