ENUM型

MySQL で利用可能なデータ型の中で文字列型の ENUM 型の使い方について解説します。

(Last modified: )

ENUM型について

文字列型の中でも ENUM 型は、事前に定義した文字列のリストの中からいずれか一つと同じ値を格納することができるデータ型です。内部的には ENUM 値は整数として格納され、各値にはインデックスが割り当てられます。

ENUM('value1','value2',...) [CHARACTER SET charset_name]
 [COLLATE collation_name]

文字列のリストには最大 65,535 個の個別の要素を含めることができます。このデータ型が設定されたカラムには、文字列リストの中のいずれかと同じ値しか格納することができません。

例として ENUM 型のカラムを持つテーブルを作成してみます。

create table strtest(product varchar(8), num1 enum('Blue', 'Yellow', 'White'));

ENUM型について(1)

ENUM 型のカラムには値として 'Blue' 、 'Yello' 、 'White' がリストされています。よってこのカラムにはこの3つの文字列のいずれか(および NULL )しか格納することはできません。

実際にテーブルに値を追加してみます。

insert into strtest values('Desk', 'Blue');
insert into strtest values('Mouse', 'White');

ENUM型について(2)

リストに含まれていない値を格納しようとすると Data truncated for column 'カラム名' というエラーが発生します。

insert into strtest values('PC', 'Green');

ENUM型について(3)

ENUM 型を使うとカラムに格納することができる値を簡単に制限することができます。また別のメリットとして文字列をそのままカラムに保存する場合と比べて、 ENUM 型のカラムの値は内部的には整数の値が保存されています。よって必要となる容量を少なくすることができます。

NULLの扱い

NULL は ENUM 型のリストに含まれていない場合でもデータとして格納することができます。先ほど作成したテーブルに次のようなデータを追加してみます。

insert into strtest values('Printer', NULL);

NULLの扱い(1)

それではテーブルからデータを取得してみます。

select * from strtest;

NULLの扱い(2)

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

ENUM型のインデックス

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

他にも何らかの理由で無効な値が格納されそうになった時は空文字 '' が格納されますが、空文字のインデックスは常に 0 です。また NULL のインデックスは NULL です。

ENUM('Blue','Yellow','White')

''         インデックス 0
'Blue'     インデックス 1
'Yellow'   インデックス 2
'White'    インデックス 3
NULL       NULL

ENUM型が設定されているカラムにデータを追加する場合、文字列の代わりにインデックスを指定することができます。例として先ほど作成したテーブルに次のようなデータを追加してみます。

insert into strtest values('Display', 1);

このカラムのインデックス 1 に相当する値は 'Blue' なので 'Blue' が格納されています。

ENUM型のインデックス(1)

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

select * from strtest where num1 = 'Blue';
select * from strtest where num1 = 1;

ENUM型のインデックス(2)

文字セットと照合順序

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

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

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

-- --

MySQL で利用可能なデータ型の中で文字列型の ENUM 型の使い方について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。