ENUM型

広告

ここでは文字列型の中でもENUM型について確認していきます。書式は次の通りです。

ENUM('value1','value2',...)

ENUM型では文字列定数をリストします。このデータ型が設定されたカラムに値を格納する場合、このリストの中の文字列定数の一つを指定します。(例外はあります)。またリストできる値は65,535までです。

例として次のように記述します。

mysql> CREATE TABLE test(col ENUM('red','blue','yellow'));

p7-1

カラムcolにはENUM型が設定してあります。ENUM型には'red','blue','yellow'の3つの値をリストとして記載していますので、このテーブルにデータを追加する場合にはcolカラムには'red','blue','yellow'のいずれか一つを指定して下さい。

mysql> INSERT INTO test(col) VALUES('blue');

p7-2

リストに含まれていない値を格納しようとした場合、Strict modeが有効な場合にはエラーとなります。無効の場合には空白が代入されます。

mysql> INSERT INTO test(col) VALUES('black');

p7-3

実際試してみるとエラーとなりますのでMySQLサーバがStrict modeが有効となっていると考えられます。実際次のようなSQL文を実行して確認できます。

mysql> SELECT @@global.sql_mode;

p7-4

「STRICT_TRANS_TABLES」が設定されていることが確認できます。これはオプションファイルである「my.ini」に次のような記述があり設定されているためです。

# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

NULL

NULLはリストに含まれていない場合でもデータとして指定することができます。

mysql> INSERT INTO test(col) VALUES(null);

p7-5

NULLはそのままNULLとして格納されます。

インデックス

ENUM型にリストされた文字列定数には順にインデックスが割り当てられます。インデックスは1から開始されます。

ENUM('red','blue','yellow')

'red'      インデックス 1
'blue'     インデックス 2
'yellow'   インデックス 3

※ NULLがデータとして格納された場合、NULLのインデックスはNULLとなります。

ENUM型が設定されているカラムにデータを追加する場合、文字列の代わりにインデックスを指定することができます。

mysql> CREATE TABLE test(col ENUM('red','blue','yellow'));

mysql> INSERT INTO test(col) VALUES(2);

上記の場合、インデックス2に該当する'blue'が格納されます。

p7-6

またWHERE句の値としてインデックスを指定することもできます。つまり次の2つのSELECT文は同じ結果を取得できます。

SELECT * FROM test WHERE col = 'blue';
SELECT * FROM test WHERE col = 2;

p7-7

文字セットと照合順序

ENUM型は文字セットと照合順序を指定することができます。使い方は次の通りです。

ENUM('value1','value2',...) [CHARACTER SET 文字セット] [COLLATE 照合順序]

文字セットと照合順序の設定についてはCHAR型などと同じです。詳しくは「CHAR型とVARCHAR型」を参照して下さい。

( Written by Tatsuo Ikura )