2018-05-10

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

技术小能手 2018-05-07 09:17:13 浏览200 评论0

云栖社区


测试


odbc

摘要: 测试表DDL CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL, `dt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' ) ENGINE=InnoDB; 插入测试数据: yejr@imysql.

测试表DDL

CREATE TABLE `t1`(`id`int(11)DEFAULTNULL,`dt` datetime NOTNULLDEFAULT'0000-00-00 00:00:00')ENGINE=InnoDB;

插入测试数据:

yejr@imysql.com>insert intot1(id)select1;---不指定dt列的值yejr@imysql.com>insert into t1 select2,now();---指定dt列的值为now()yejr@imysql.com>insert intot1(id)select3;---不指定dt列的值

查询数据:

yejr@imysql.com>select*from t1 where dt is null;+------+---------------------+|id|dt|+------+---------------------+|1|0000-00-0000:00:00||3|0000-00-0000:00:00|+------+---------------------+2rows in set(0.00sec)

有没有觉得很奇怪,为什么查到了2条 dt 列值为 '0000-00-00 00:00:00' 的记录?

先查看执行计划:

yejr@imysql.com>desc select*from t1 where dt is null\G***************************1.row***************************id:1select_type:SIMPLE table:t2 partitions:NULLtype:ALLpossible_keys:NULLkey:NULLkey_len:NULLref:NULLrows:5filtered:20.00Extra:Using where1row in set,1warning(0.00sec)yejr@imysql.com>show warnings\G***************************1.row***************************Level:Note Code:1003Message:/* 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 ISNULL

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

本文作者:叶师傅春茶开售啦

本文来自云栖社区合作伙伴“老叶茶馆”,了解相关信息可以关注“老叶茶馆”。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 说起我国最早的货币,大约是在夏商之际,海贝成了先祖们制作货币的首选,也成为了中国最早的钱币,贝币。商周时期贝类的货...
    古缘陈经理阅读 1,625评论 0 0
  • 有一种感觉总在沉默时,才承认是“相思”;有一种缘分总在梦醒后,才相信是“永恒”;有一种心情总在离别后,才明白是“失落”。
    风中月隐阅读 2,784评论 0 0
  • 最近项目中有一个功能,注册的时候需要验证邮箱,发送激活连接,激活之后才能登陆,在写的时候也是遇到了一些小阻碍,这里...
    sinnamm阅读 5,095评论 0 2

友情链接更多精彩内容