MySQL NOT NULL列用 WHERE IS NULL 也能查到資料的原因
現象
mysql用where is null查出的結果,和我們預期不符,如下:
mysql> select * from t where create_time is null; +----+----------+---------------------+ | id | name | create_time | +----+----------+---------------------+ | 1 | zhangsan | 0000-00-00 00:00:00 | | 2 | lisi | 0000-00-00 00:00:00 | +----+----------+---------------------+ 2 rows in set (0.00 sec)
分析
該表結構為:
mysql> show create table t \G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` int(11) NOT NULL, `name` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'kong', `create_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB 1 row in set (0.00 sec)
該表資料為:
mysql> insert into t values (1,'zhangsan'); Query OK, 1 row affected (0.10 sec) mysql> insert into t values (2,'lisi'); Query OK, 1 row affected (0.11 sec mysql> insert into t values ('4','wangwu','2022-07-01 10:00:00'); Query OK, 1 row affected (0.11 sec) mysql> select * from t; +----+----------+---------------------+ | id | name | create_time | +----+----------+---------------------+ | 1 | zhangsan | 0000-00-00 00:00:00 | | 2 | lisi | 0000-00-00 00:00:00 | | 4 | wangwu | 2022-07-01 10:00:00 | +----+----------+---------------------+ 3 rows in set (0.00 sec)
用where is null查資料,竟然可以查到0000-00-00 00:00:00的資料,和我們預期不符:
mysql> select * from t where create_time is null; +----+----------+---------------------+ | id | name | create_time | +----+----------+---------------------+ | 1 | zhangsan | 0000-00-00 00:00:00 | | 2 | lisi | 0000-00-00 00:00:00 | +----+----------+---------------------+ 2 rows in set (0.00 sec)
分析該sql執行計劃:
mysql> desc select * from t where create_time is null \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: t 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)
看到該sql有warning,檢視一下:
mysql> show warnings; SELECT `czx`.`t`.`id` AS `id`, `czx`.`t`.`name` AS `name`, `czx`.`t`.`create_time` AS `create_time` FROM `czx`.`t` WHERE ( `czx`.`t`.`create_time` = '0000-00-00 00:00:00') 1 row in set (0.00 sec)
可以看到,mysql把where create_time is null ,偷偷的轉換成了,where create_time = '0000-00-00 00:00:00',這是為什麼呢?
帶著疑問查閱mysql官方文件,得到如下答案:
大意是,對於日期型別,MySQL會把0000-00-00,當成null值處理。這麼做的原因是,odbc不支援0000-00-00的日期資料。
官方文件還有如下說明:
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-types.html
大意是,MySQL允許儲存0000-00-00作為假日期,這比用null更加方便,但是odbc會自動將zero date轉為null。
結論
MySQL會將0000-00-00這樣的日期當做null對待,所以用where is null查詢可以顯示他們。
如果不想要這樣的現象,建議可以不在日期裡面儲存zero date,可以用當前時間處理預設值,比如:
alter table t add column create_time datetime not null default CURRENT_TIMESTAMP;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28916011/viewspace-2903819/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- create table as select where 1=0會把null和not null屬性也帶上Null
- MySQL中is not null和!=null和<>null的區別MySqlNull
- mysql探究之null與not nullMySqlNull
- MySQL NULLMySqlNull
- MySQL案例-TIMESTAMP NOT NULL與NULLMySqlNull
- MySQL為何不建議使用null列MySqlNull
- MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!MySqlNull索引
- ((NULL) null).printNULL();((NULL) null).printnull();Null
- MYSQL timestamp NOT NULL插入NULL的報錯問題MySqlNull
- MySQL null值儲存,null效能影響MySqlNull
- 資料列not null對索引影響一例Null索引
- NULL的資料型別(二)Null資料型別
- 了不起的 “filter(NULL IS NOT NULL)”FilterNull
- MySQL null和''分析MySqlNull
- mysql分割槽nullMySqlNull
- mysql 查詢欄位為null或者非nullMySqlNull
- NULL列時,如何使得IS NULL或者IS NOT NULL可以使用索引來提高查詢效率Null索引
- IS NULL和IS NOT NULLNull
- where語句中多條件查詢欄位NULL與NOT NULL不確定性查詢Null
- mysql資料庫其中一列為null,他會有什麼坑MySql資料庫Null
- 去除陣列中的 null 值陣列Null
- 【NULL】Where子句中=1 與!=1UNION後的結果是全集麼?——NULL小夥惹的禍Null
- not null與check is not nullNull
- 故障分析 | MySQL 遷移後 timestamp 列 cannot be nullMySqlNull
- 快速理解MySQL null的10大坑MySqlNull
- 用資料也能講故事?
- 【NULL】Oracle null值介紹NullOracle
- 索引與null(一):單列索引索引Null
- mysql中null與“空值”的坑MySqlNull
- MySQL中的NULL和空串比較MySqlNull
- MySQL裡null與空值的辨析MySqlNull
- 資料庫系統 空值 null資料庫Null
- TreeMap get獲取資料為nullNull
- Difference between 2>&-, 2>/dev/null, |&, &>/dev/null, >/dev/null, 2>&1devNull
- 理解:MySQL的null與空字串的不同MySqlNull字串
- 2>/dev/null和>/dev/null 2>&1和2>&1>/dev/null的區別devNull
- MySQL-去掉不為null的欄位MySqlNull
- 小白也能懂的Mysql資料庫索引詳解MySql資料庫索引