NOT NULL列用IS NULL也能查到数据?

阿里云幸运券

导读
datetime列设置了NOT NULL约束,但查询条件IS NULL却能返回结果,奇怪吗?

测试表DDL

CREATE TABLE t1 (
id int(11) DEFAULT NULL,
dt datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00’
) ENGINE=InnoDB;
插入测试数据:

[email protected]> insert into t1(id) select 1; — 不指定dt列的值
[email protected]> insert into t1 select 2, now(); — 指定dt列的值为now()
[email protected]> insert into t1(id) select 3; — 不指定dt列的值
查询数据:

[email protected]> select * from t1 where dt is null;
±-----±--------------------+
| id | dt |
±-----±--------------------+
| 1 | 0000-00-00 00:00:00 |
| 3 | 0000-00-00 00:00:00 |
±-----±--------------------+
2 rows in set (0.00 sec)
有没有觉得很奇怪,为什么查到了2条 dt 列值为 ‘0000-00-00 00:00:00’ 的记录?

先查看执行计划:

[email protected]> desc select * from t1 where dt is null\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t2
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 5
filtered: 20.00
Extra: Using where
1 row in set, 1 warning (0.00 sec)

[email protected]> show warnings\G
*************************** 1. row ***************************
Level: Note
Code: 1003
Message: /* select#1 */ select yejr.t1.id AS id,yejr.t2.dt AS dt from yejr.t1 where (yejr.t1.dt = ‘0000-00-00 00:00:00’)
发现 IS NULL 条件被转换了,所以才能查到结果,这是为什么呢? 我尝试了调整SQL_MODE,发现并没什么卵用,最后还是在官方文档找到了答案:

For DATE and DATETIME columns that are declared as NOT NULL, you can find the special date ‘0000-00-00’ by using a statement like this:

SELECT * FROM tbl_name WHERE date_column IS NULL
This is needed to get some ODBC applications to work because ODBC does not support a ‘0000-00-00’ date value.

See Obtaining Auto-Increment Values, and the description for the FLAG_AUTO_IS_NULL option at Connector/ODBC Connection Parameters.

文档出自:12.3.2 Comparison Functions and Operators, https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html

啊,对了,MySQL版本是 5.7.21。

腾讯云代金券

原文链接

https://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ%3D%3D&mid=2653931578&idx=1&sn=8444f0c38330070d2d5747226edd5c89&chksm=bd3b52508a4cdb46119b699946df453d8b73a827fdfa540997634e563015dbd0a94427f4ed64&mpshare=1&scene=23&srcid=0507I63OKSgDjF18L5PtpPQ1%23rd

服务推荐

猜你喜欢

转载自blog.csdn.net/weixin_44476888/article/details/89456802