mysqlのsetとenumタイプの使い方と違い
mysqlのenumとsetは実はstringタイプで、指定したセットでしか値を取ることができません.
異なるのはsetが複数の値を取ることができ、enumは1つの値しか取れないことです.無効な値を
列挙値ごとにインデックス値があります.列の説明において、リスト値によって許可されるメンバー値は、1から番号付けされる. 空の文字列エラー値のインデックス値は0です.これは、以下に示す
たとえば、
値
インデックス値
0
1
2
3
テスト中に'''を発見した場合、データが調べられないことを0で表します.
置換列挙には、最大65535個のメンバー値があります.
MySQL 3.23.51から、テーブルが作成されると、
1つのデジタル文脈で
1つの数字が
異なるのはsetが複数の値を取ることができ、enumは1つの値しか取れないことです.
CREATE TABLE `20121101_t` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`cl` set('x','w','r') NOT NULL,
`c2` enum('f','d') NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB
insert into 20121101_t
values(null,'a.txt','r,w','d');
insert into 20121101_t
values(null,'b.txt','r,w','f');
ENUM
は文字列オブジェクトであり、その値は通常、テーブル作成時のカラム仕様説明に明確に列挙された許容値リストから選択される.次の場合、値は空白列(""
)またはNULL
であってもよい.ENUM
(すなわち、許容値リストにない文字列)に挿入すると、空の文字列が特殊なエラー値として挿入されます.実際、この文字列は「通常」の空の文字列とは異なり、この文字列には数値インデックス値が0であるためです.詳細は後述する.ENUM
がNULL
NULL
として宣言された場合、カラムのデフォルト値もNULL
となります.ENUM
がNOT NULL
として宣言された場合、カラムのデフォルト値はリストで許可されている値の最初のメンバーになります.列挙値ごとにインデックス値があります.
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
テスト中に'''を発見した場合、データが調べられないことを0で表します.
置換列挙には、最大65535個のメンバー値があります.
MySQL 3.23.51から、テーブルが作成されると、
ENUM
の値の末尾のスペースが自動的に削除されます.ENUM
列に値を割り当てる場合、アルファベットの大文字と小文字は重要ではありません.ただし、後でカラムから取得した値の大文字と小文字は、テーブルの作成時に指定した許容値に一致します.1つのデジタル文脈で
ENUM
が取得されると、カラム値のインデックス値が返されます.たとえば、このように数値値を使用してENUM
列を取得できます.mysql> SELECT enum_col+0 FROM tbl_name;
1つの数字が
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_colum
を使用します.