mysql> CREATE TABLE hoge (id INTEGER PRIMARY KEY AUTO_INCREMENT, s SET('foo', 'bar', '') NOT NULL DEFAULT ''); Query OK, 0 rows affected (0.02 sec) mysql> DESCRIBE hoge; +-------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | s | set('foo','bar','') | NO | | | | +-------+---------------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) mysql> INSERT INTO hoge VALUES (); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO hoge (s) VALUES (''), (','), ('foo'), ('foo,'); Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM hoge; +----+------+ | id | s | +----+------+ | 1 | | | 2 | | | 3 | | | 4 | foo | | 5 | foo, | +----+------+ 5 rows in set (0.00 sec) mysql> SELECT * FROM hoge WHERE s = ''; +----+---+ | id | s | +----+---+ | 1 | | | 2 | | | 3 | | +----+---+ 3 rows in set (0.00 sec) mysql> SELECT * FROM hoge WHERE FIND_IN_SET('', s); +----+------+ | id | s | +----+------+ | 3 | | | 5 | foo, | +----+------+ 2 rows in set (0.00 sec)
DEFAULT VALUEとして入るものや明示的に空文字を指定した場合はFIND_IN_SETでは検出されず、でもカンマを含めて入力したものは「空文字というvalueを含むSET値」として認識される。
見た目では分からないけども。
数値として見てみるとよく分かるようだ。
MySQL :: MySQL 5.6 Reference Manual :: 11.4.5 The SET Type
mysql> SELECT *, s + 0 FROM hoge; +----+------+-------+ | id | s | s + 0 | +----+------+-------+ | 1 | | 0 | | 2 | | 0 | | 3 | | 4 | | 4 | foo | 1 | | 5 | foo, | 5 | +----+------+-------+ 5 rows in set (0.00 sec) mysql> SELECT *, s + 0 FROM hoge WHERE s = 0; +----+---+-------+ | id | s | s + 0 | +----+---+-------+ | 1 | | 0 | | 2 | | 0 | +----+---+-------+ 2 rows in set (0.00 sec) mysql> SELECT *, s + 0 FROM hoge WHERE s & 4; +----+------+-------+ | id | s | s + 0 | +----+------+-------+ | 3 | | 4 | | 5 | foo, | 5 | +----+------+-------+ 2 rows in set (0.00 sec)
なるほどー。
スキーマでDEFAULT値を指定するのも、","で入れておくと「空文字というvalue」がデフォルトになるようだ。
mysql> DROP TABLE hoge; Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE hoge (id INTEGER PRIMARY KEY AUTO_INCREMENT, s SET('foo', 'bar', '') NOT NULL DEFAULT ','); Query OK, 0 rows affected (0.02 sec) mysql> SHOW CREATE TABLE hoge\G *************************** 1. row *************************** Table: hoge Create Table: CREATE TABLE `hoge` ( `id` int(11) NOT NULL AUTO_INCREMENT, `s` set('foo','bar','') NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) mysql> DESCRIBE hoge; +-------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | s | set('foo','bar','') | NO | | | | +-------+---------------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) mysql> INSERT INTO hoge VALUES (); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO hoge (s) VALUES (''), (','); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> SELECT *, s + 0 FROM hoge; +----+---+-------+ | id | s | s + 0 | +----+---+-------+ | 1 | | 4 | | 2 | | 0 | | 3 | | 4 | +----+---+-------+ 3 rows in set (0.00 sec) mysql> SELECT *, s + 0 FROM hoge WHERE FIND_IN_SET('', s); +----+---+-------+ | id | s | s + 0 | +----+---+-------+ | 1 | | 4 | | 3 | | 4 | +----+---+-------+ 2 rows in set (0.00 sec)
見た目じゃ全然わからんw