Edited at

MySQLのSET型を使ってみようとしてやめた

More than 3 years have passed since last update.

MySQLのSET型を使ってみようとしてやめた時のメモ。

ドキュメント→ http://dev.mysql.com/doc/refman/5.6/en/set.html

作ったテーブルはこんなの。

CREATE TABLE `Color` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,
`flags` set('red','blue','green') DEFAULT NULL,
`name` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `flags_INDEX` (`flags`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

下記のデータを突っ込んで、試します

INSERT Color (flags, name) VALUES

('red', '赤'),
('blue', '青'),
('green', '緑'),
('red,blue', '紫'),
('red,green', '黄'),
('blue,green', '水'),
('red,blue,green', '白');

flags に blue を含んだものを取得したい場合

SELECT * FROM Color WHERE FIND_IN_SET('blue', flags);

# id, flags, name

2, blue, 青
4, red,blue, 紫
6, blue,green, 水
7, red,blue,green, 白


なんでやめたの

上のクエリ、インデックスが効くわけじゃないんです。like 句を使っても書ける とドキュメントにあるんだけど、そっち使って書いても駄目。

一応、blue or red,blue or blue,green or red,blue,green みたいな書き方をすると効くんだけど、いやいやいや……。

フラグが増えたらALTER TABLEなのかとかも気になったし、とても古い記事だけど 使うべきじゃない という記事も読んでしまい、結局使うのをやめました。まぁ利用用途次第ですかね。