読者です 読者をやめる 読者になる 読者になる

MySQL で sql_mode が Strict なときの ENUM 型

下記の2つの記事を読んで「でも sql_mode が Strict なときに ENUM に Invalid な値? 整数値が 0 である値? を合法的に入れる方法あったっけ?」と思ってやってみたら妙なことに・・・

テーブル作る。

mysql> set @@sql_mode = STRICT_TRANS_TABLES;
mysql> CREATE TABLE flg(id SERIAL, flg1 ENUM("1") NOT NULL);
Query OK, 0 rows affected (0.05 sec)

整数 0 では入れられない。

mysql> INSERT INTO flg(flg1) VALUES (0);
ERROR 1265 (01000): Data truncated for column 'flg1' at row 1

空文字でも入れられない。

mysql> INSERT INTO flg(flg1) VALUES ('');
ERROR 1265 (01000): Data truncated for column 'flg1' at row 1

整数 2 のような範囲外の値でも入れられない。

mysql> INSERT INTO flg(flg1) VALUES (2);
ERROR 1265 (01000): Data truncated for column 'flg1' at row 1

文字列 '0' だと・・・!?

mysql> INSERT INTO flg(flg1) VALUES ('0');
Query OK, 1 row affected (0.00 sec)

どうして??

mysql> select * from flg where flg1 = 0;
+----+------+
| id | flg1 |
+----+------+
|  1 |      |
+----+------+
1 row in set (0.00 sec)

mysql> select * from flg where flg1 = '0';
Empty set (0.00 sec)