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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL NULLMySqlNull
- MYSQL timestamp NOT NULL插入NULL的報錯問題MySqlNull
- MySQL為何不建議使用null列MySqlNull
- MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!MySqlNull索引
- MySQL null值儲存,null效能影響MySqlNull
- MySQL null和''分析MySqlNull
- NULL列時,如何使得IS NULL或者IS NOT NULL可以使用索引來提高查詢效率Null索引
- 故障分析 | MySQL 遷移後 timestamp 列 cannot be nullMySqlNull
- mysql資料庫其中一列為null,他會有什麼坑MySql資料庫Null
- 去除陣列中的 null 值陣列Null
- [20190612]NULL的資料型別.txtNull資料型別
- 【NULL】Oracle null值介紹NullOracle
- mysql中null與“空值”的坑MySqlNull
- 索引與null(一):單列索引索引Null
- 資料庫系統 空值 null資料庫Null
- 2>/dev/null和>/dev/null 2>&1和2>&1>/dev/null的區別devNull
- MySQL-去掉不為null的欄位MySqlNull
- 快速理解MySQL null的10大坑MySqlNull
- MySQL 的 NULL 值是怎麼儲存的?MySqlNull
- PropertyChanged == nullNull
- mysql遇到Variable can’t be set to the value of ‘NULL’MySqlNull
- mysql 空值(null)和空字元('')的區別MySqlNull字元
- NULL在oracle和mysql索引上的區別NullOracleMySql索引
- 面試題((A)null).fun()——java中null值的強轉面試題NullJava
- JavaScript基本資料型別之undefined和nullJavaScript資料型別UndefinedNull
- 為什麼索引無法使用is null和is not null索引Null
- MySQL null值欄位是否使用索引的總結MySqlNull索引
- 今天測試了一下mysql的Null值MySqlNull
- null與indexNullIndex
- null 和 undefinedNullUndefined
- 小白也能懂的Mysql資料庫索引詳解MySql資料庫索引
- python 中空NULL的表示PythonNull
- null調整為not null default xxx,不得不注意的坑Null
- 為什麼資料庫欄位要使用NOT NULL?資料庫Null
- Mysql:Variable 'XXXt' can't be set to the value of 'NULL'解決MySqlNull
- 隨筆:MySQL中'' ' ' NULL在Innodb儲存的區別MySqlNull
- 沒有列存的MySQL千萬級分析也能支援MySql
- null 和 undefined 的區別NullUndefined