亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL中日期為零值的處理方法

發布時間:2021-08-09 12:48:15 來源:億速云 閱讀:138 作者:chen 欄目:MySQL數據庫

這篇文章主要講解了“MySQL中日期為零值的處理方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“MySQL中日期為零值的處理方法”吧!

前言:

前面文章我們介紹過日期和時間字段的查詢方法,最近遇到日期值為零的問題。原來了解過和 sql_mode 參數設置有關,但還不是特別清楚,本篇文章將探究下MySQL怎么處理日期值為零的問題。

1.問題描述

這里我們說的日期為零值是指年、月、日為零,即’0000-00-00’。顯然,這是不合法的日期值,但由于設計問題或歷史遺留問題,有時候數據庫中有類似日期值為零的數據,默認情況下插入零值日期會報錯,可以通過修改參數sql_mode模式來避免該問題。下面展示下默認情況下插入零值的情況:

# 首先創建測試表
CREATE TABLE `t_zerodate` (
  `increment_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',
  `year_col` year DEFAULT NULL COMMENT '年',
  `date_col` date DEFAULT NULL COMMENT '日期',
  `dt_col` datetime DEFAULT NULL COMMENT 'datetime時間',
  `ts_col` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'timestamp時間',
  PRIMARY KEY (`increment_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='zerodate';
# 查看sql_mode模式
mysql> select @@sql_mode;
+----------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                         |
+----------------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------------------------------------------+
# 分別插入年、月、日為零值測試
# 年份為0000 插入成功
mysql> insert into t_zerodate (year_col) values (0000);
Query OK, 1 row affected (0.02 sec)
# 月、日都不為零時 可插入成功
mysql> insert into t_zerodate (date_col) values ('0000-00-00');
ERROR 1292 (22007): Incorrect date value: '0000-00-00' for column 'date_col' at row 1
mysql> insert into t_zerodate (date_col) values ('0000-01-00'); 
ERROR 1292 (22007): Incorrect date value: '0000-01-00' for column 'date_col' at row 1
mysql> insert into t_zerodate (date_col) values ('0000-00-01');
ERROR 1292 (22007): Incorrect date value: '0000-00-01' for column 'date_col' at row 1
mysql> insert into t_zerodate (date_col) values ('0000-01-01'); 
Query OK, 1 row affected (0.02 sec)
2.sql_mode變更測試

關于sql_mode,原來寫過一篇文章,sql_mode支持多個變量的不同組合,不同的sql_mode影響服務端支持的SQL語法以及數據校驗規則。其中 NO_ZERO_IN_DATENO_ZERO_DATE這兩個變量影響MySQL對日期零值的處理。上面測試中可以發現,嚴格模式下,當sql_mode中包含NO_ZERO_IN_DATE,NO_ZERO_DATE兩個變量時,月和日都不為零時可以插入成功。

乍一看,NO_ZERO_IN_DATE和NO_ZERO_DATE兩個變量很相似,但作用有什么不同呢?下面我們給出這兩個變量的作用并做下具體測試。

NO_ZERO_DATE模式影響服務端是否允許將 ‘0000-00-00’ 作為有效日期。其效果還取決于sql_mode是否啟用了嚴格模式。

  • 如果未啟用此模式,’0000-00-00’則允許插入并且不會產生警告。

  • 如果只啟用此模式,’0000-00-00’則允許插入但是會產生警告。

  • 如果啟用了此模式和嚴格模式,’0000-00-00’則會被認定為非法,并且插入也會產生錯誤。除非同時帶有IGNORE,對于 INSERT IGNORE和UPDATE IGNORE,’0000-00-00’則允許插入但是會產生警告。

NO_ZERO_IN_DATE模式影響服務端是否允許插入年份部分非零但月或日部分為0的日期。(例如’2010-00-01’或 ‘2010-01-00’,但不影響日期’0000-00-00’),其效果同樣還取決于sql_mode是否啟用了嚴格模式。

  • 如果未啟用此模式,則允許部分為零的日期插入,并且不會產生任何警告。

  • 如果只啟用此模式,則將該零值日期插入為’0000-00-00’并產生警告。

  • 如果啟用了此模式和嚴格模式,則除非IGNORE同時指定,否則不允許插入為零的日期。對于INSERT IGNORE和 UPDATE IGNORE,將該零值日期插入為’0000-00-00’并產生警告。

同時,官方文檔中指出:NO_ZERO_DATE和NO_ZERO_IN_DATE雖然不是嚴格模式的一部分,但應與嚴格模式結合使用,如果在未啟用嚴格模式的情況下啟用了NO_ZERO_DATE或NO_ZERO_IN_DATE則會產生警告,反之亦然,(sql_mode中包含STRICT_TRANS_TABLES,一般可認為啟用了嚴格模式)。

下面我們來測試下,嚴格模式下分別啟用和不啟用這兩個變量的效果:

1.嚴格模式下 同時啟用NO_ZERO_DATE、NO_ZERO_IN_DATE
# 上文已經測試過,正常情況下 月、日都不為零時 可插入成功
# 下面測試insert ignore into
mysql> set session sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
Query OK, 0 rows affected (0.00 sec)
mysql> truncate table t_zerodate;
Query OK, 0 rows affected (0.07 sec)
mysql> insert ignore into t_zerodate (date_col) values ('0000-00-00');
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> insert ignore into t_zerodate (date_col) values ('2010-00-00');    
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> insert ignore into t_zerodate (date_col) values ('2010-01-00'); 
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> insert ignore into t_zerodate (date_col) values ('2010-00-01');
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> select date_col from t_zerodate;
+------------+
| date_col   |
+------------+
| 0000-00-00 |
| 0000-00-00 |
| 0000-00-00 |
| 0000-00-00 |
+------------+
# 結論:
正常情況下 月、日都不為零時 可插入成功;
對于INSERT IGNORE則允許插入,但會產生告警,并會將零值日期保存為'0000-00-00'。
2.嚴格模式下 不啟用NO_ZERO_DATE
mysql> set session sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> truncate table t_zerodate;
Query OK, 0 rows affected (0.08 sec)
mysql> insert into t_zerodate (date_col) values ('0000-00-00');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t_zerodate (date_col) values ('2010-00-01');
ERROR 1292 (22007): Incorrect date value: '2010-00-01' for column 'date_col' at row 1
mysql> insert into t_zerodate (date_col) values ('2010-01-00'); 
ERROR 1292 (22007): Incorrect date value: '2010-01-00' for column 'date_col' at row 1
mysql> insert into t_zerodate (date_col) values ('0000-00-01');
ERROR 1292 (22007): Incorrect date value: '0000-00-01' for column 'date_col' at row 1
mysql> insert into t_zerodate (date_col) values ('0000-01-00');
ERROR 1292 (22007): Incorrect date value: '0000-01-00' for column 'date_col' at row 1
# 結論:
'0000-00-00'可以正常插入,其余月、日為零的日期插入會報錯;
對于INSERT IGNORE則允許插入,但會產生告警,并會將零值日期保存為'0000-00-00'。
3.嚴格模式下 不啟用NO_ZERO_IN_DATE
mysql> set session sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> truncate table t_zerodate;
Query OK, 0 rows affected (0.07 sec)
mysql> insert into t_zerodate (date_col) values ('0000-00-00');
ERROR 1292 (22007): Incorrect date value: '0000-00-00' for column 'date_col' at row 1
mysql> insert into t_zerodate (date_col) values ('2010-00-00');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t_zerodate (date_col) values ('2010-00-01');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t_zerodate (date_col) values ('2010-01-00');
Query OK, 1 row affected (0.00 sec)
mysql> insert ignore into t_zerodate (date_col) values ('0000-00-00');
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> select date_col from t_zerodate;
+------------+
| date_col   |
+------------+
| 2010-00-00 |
| 2010-00-01 |
| 2010-01-00 |
| 0000-00-00 |
+------------+
# 結論:
'0000-00-00'插入報錯,其余月、日為零的日期可以正常插入;
對于INSERT IGNORE則允許插入'0000-00-00',但會產生告警。
4.嚴格模式下 NO_ZERO_DATE和NO_ZERO_IN_DATE都不啟用
mysql> set session sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> truncate table t_zerodate;
Query OK, 0 rows affected (0.09 sec)
mysql> insert into t_zerodate (date_col) values ('0000-00-00');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t_zerodate (date_col) values ('2010-00-00');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t_zerodate (date_col) values ('2010-00-01');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t_zerodate (date_col) values ('2010-01-00');
Query OK, 1 row affected (0.01 sec)
# 結論:
'0000-00-00'和其余月、日為零的日期都可以正常插入。
3.結論及建議

簡單總結下,NO_ZERO_DATE模式影響’0000-00-00’日期的插入,NO_ZERO_IN_DATE模式影響除’0000-00-00’外的月、日為零的日期的插入。另外無論何種模式,YEAR類型都允許0000插入,這兩個變量影響的是DATE、DATETIME、TIMESTAMP三種字段類型中對日期部分為零的處理。

至于我們是否要啟用這兩種模式,這取決于業務需求。如果你的業務有插入零值日期的需求,則可以選擇sql_mode中不要包含NO_ZERO_DATE和NO_ZERO_IN_DATE,例如,某字段要求設置為DATE類型且不為空,默認值設為’0000-00-00’。一般情況下,NO_ZERO_DATE和NO_ZERO_IN_DATE建議同時有或者同時沒有,有插入零日期值的需求則可以去除二者,沒有此類需要則可以保留二者。這里提醒下,官方文檔中講到,這兩個變量在未來版本中不再作為獨立變量使用,故官方不推薦使用。

感謝各位的閱讀,以上就是“MySQL中日期為零值的處理方法”的內容了,經過本文的學習后,相信大家對MySQL中日期為零值的處理方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

靖宇县| 常宁市| 邻水| 临洮县| 鄂伦春自治旗| 遂平县| 南京市| 乐清市| 定南县| 田林县| 嘉善县| 宁蒗| 玉门市| 大姚县| 文山县| 宜川县| 洱源县| 来宾市| 中宁县| 确山县| 建宁县| 宁都县| 惠州市| 读书| 南京市| 永善县| 高陵县| 榆中县| 肃北| 景宁| 小金县| 常熟市| 裕民县| 柏乡县| 泰来县| 布尔津县| 石河子市| 宕昌县| 泰州市| 灵武市| 漾濞|