新鮮

頑張らないために頑張る

SPONSORED LINK

MySQL ENUM 型のあれこれ

データベース系の資格といえば ORACLE MASTER が有名ですが、実は MySQL にも ORACLE MASTER 相当の資格があります。

  • (1Z0-882) Oracle Certified Professional, MySQL 5.6 Developer
  • (1Z0-883) Oracle Certified Professional, MySQL 5.6 Database Administrator

諸般の事情で MySQL 5.6 Developer をとらなければならなくなったので学習メモを残しておきたいと思います。資格勉強をする方や MySQL を利用する方の参考になればと思います。

今回は「ENUM型のあれこれ」です。

ENUM型とは

列挙型(れっきょがた、enumerated type)とは、コンピュータプログラミングにおいて、プログラマが選んだ各々の識別子をそのまま有限集合として持つ抽象データ型である。列挙型は一般に、カードのスートのように番号順を持たないカテゴリ変数として使われるが、実際のコンパイル時あるいは実行時には、列挙型は整数で実装されることが多い。各々の識別子は通例異なる整数値を持つが、複数の識別子に対して意図的に同じ整数値を割り当てる(つまり別名を定義する)ことも可能である。

wikipedia 列挙型 より

さっぱり意味がわからない。具体的に試してみます。

mysql> create table t (data enum('a','c','b'));
mysql> insert into t values ('a'),('b'),('c');
mysql> select * from t;
+------+
| data |
+------+
| a    |
| b    |
| c    |
+------+
mysql> insert into t values ('d');
ERROR 1265 (01000): Data truncated for column 'data' at row 1

つまり、ENUM型は任意のリファレンス値(上記の例だと'a','b','c')だけ入力できる型です。特定の値しか取りたくないときには便利な型ですね。

リファレンス値以外をいれるとエラーになります(sql-mode 依存)。なお NOT NULL 制約を入れないときは NULL が入れられます。

注意、ENUMのソート

少し注意しなければいけないのはソートの動き。

mysql> select * from t order by data;
+------+
| data |
+------+
| a    |
| c    |
| b    |
+------+

a,b,c 順じゃないですね。内部的にそれぞれのリファレンス値に裏番を付けているようで、裏番の順番でソートしてしまいます。このときは、

mysql> select * from t order by cast(data as char);
+------+
| data |
+------+
| a    |
| b    |
| c    |
+------+

のように、文字列にキャストしてあげれば良いです。

試験用チェックリスト

  • ENUM型はリファレンス値のみをとる型、sql-mode 次第で NULL は許容する
  • ENUM型をソートするときにはキャストする