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;
插入测试数据:

yejr@imysql.com> insert into t1(id) select 1; --- 不指定dt列的值

yejr@imysql.com> insert into t1 select 2, now(); --- 指定dt列的值为now()

yejr@imysql.com> insert into t1(id) select 3; --- 不指定dt列的值
查询数据:

yejr@imysql.com> 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' 的记录?

先查看执行计划:

yejr@imysql.com> 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)

yejr@imysql.com> 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.

原文发布时间为:2018-05-5
本文作者:叶师傅春茶开售啦
本文来自云栖社区合作伙伴“老叶茶馆”,了解相关信息可以关注“老叶茶馆”。请添加链接描述](http://click.aliyun.com/m/49386/)

转载于:https://blog.51cto.com/11778640/2114783

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值