MySQLのNULL値の意味

7024 ワード

今日「面白い」という質問に出会ったのは、NULL値に関する現象です.
CREATE TABLE `au` (
`id` int(11) DEFAULT NULL,
`name` varchar(10) DEFAULT NULL,
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

root@localhost : test 04:41:30>select * from au ;
+------+------+
| id | name |
+------+------+
| 1 | NULL |
| 2 | NULL |
| 3 | NULL |
+------+------+
3 rows in set (0.00 sec)

root@localhost : test 04:41:36>select * from au where name is NULl;
+------+------+
| id | name |
+------+------+
| 1 | NULL |
| 2 | NULL |
| 3 | NULL |
+------+------+
3 rows in set (0.00 sec)

nameフィールドには一意のインデックスがあり、NULLが許可されており、各NULL値が内部で異なることを示しています.しかし、なぜselectの結果がすべて表示され、この中に何か「秘密」があるのだろうか.この質問は親友@zuoxingyuさんに聞いてみましたが、まだ分かりません.unique keyがnullを判断しない場合はnot nullに設定することもあります.これについては理解できませんが、表を作るときにNULL値を持ち込むことができる以上、なぜNOT NULLに設定しなければならないのでしょうか.さらにNULL値はより省スペースです.最後に、NULLはただの識別であるため、この列がNULLであることを知っていれば、NULL値は任意の値と比較され、NULLとNULL自体を含む戻りは同じではないことが分かった.
検証:
root@localhost : test 05:25:10>select NULL is NULL,NULL=NULL;
+--------------+-----------+
| NULL is NULL | NULL=NULL |
+--------------+-----------+
|            1 |      NULL |
+--------------+-----------+

例のauテーブルで、一意のインデックスがNULL値を格納できるのは、各NULL値が異なるためである.is nullは結果を返し、NULLに属していることを証明します.