【數據庫】Invalid default value for 'create_date' timestamp field

問題

最近遇到一個這樣的問題,新建數據庫表的時候 提示 錯誤如下

Invalid default value for 'created_time' timestamp field

語句如下

`created_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '插入時間'

 

錯誤大致的意思 就是不能爲 timestamp字段設置指定的默認值,也就是語句中的 0000-00-00 00:00:00,但是很奇怪在本地就可以,爲什麼線上服務器就不行了?


本地數據庫版本:5.5.46
上線數據庫版本:5.7.17


後來經過查詢文檔(文檔地址)發現,其實從5.6.17這個版本就默認設置了不允許插入 0 日期了,術語是 NO_ZERO_IN_DATE  NO_ZERO_DATE


解決方案

如果一定要設置爲 0 日期的話,也是可以的,找到mysql的配置文件,在修改sql-mode,然後重啓數據庫服務

[mysqld]
#set the SQL mode to strict
#sql-mode="modes..." 
sql-mode = "STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"


查看sql-mode設置值的命令


SHOW VARIABLES LIKE 'sql_mode';


爲什麼

知道如何解決,但是我們也要想想爲什麼官網要這麼設置,我個人理解如下:其實我們都知道 timestamps的範圍是從 1970-01-01 00:00:01 到 2038-01-19 03:14:07,而數據庫在發展的過程中 官網應該認爲存儲0日期是非常不正常的事情(或者存儲0要花銷更多的資源)


sql_mode常用值

  • ONLY_FULL_GROUP_BY:對於GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現,那麼這個SQL是不合法的,因爲列不在GROUP BY從句中


  • NO_AUTO_VALUE_ON_ZERO:該值影響自增長列的插入。默認設置下,插入0或NULL代表生成下一個自增長值。如果用戶 希望插入的值爲0,而該列又是自增長的,那麼這個選項就有用了。


  • STRICT_TRANS_TABLES:在該模式下,如果一個值不能插入到一個事務表中,則中斷當前的操作,對非事務表不做限制


  • NO_ZERO_IN_DATE:在嚴格模式下,不允許日期和月份爲零


  • NO_ZERO_DATE:設置該值,mysql數據庫不允許插入零日期,插入零日期會拋出錯誤而不是警告。


  • ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE過程中,如果數據被零除,則產生錯誤而非警告。如 果未給出該模式,那麼數據被零除時MySQL返回NULL


  • NO_AUTO_CREATE_USER:禁止GRANT創建密碼爲空的用戶


  • NO_ENGINE_SUBSTITUTION:如果需要的存儲引擎被禁用或未編譯,那麼拋出錯誤。不設置此值時,用默認的存儲引擎替代,並拋出一個異常


  • PIPES_AS_CONCAT:將"||"視爲字符串的連接操作符而非或運算符,這和Oracle數據庫是一樣的,也和字符串的拼接函數Concat相類似


  • ANSI_QUOTES:啓用ANSI_QUOTES後,不能用雙引號來引用字符串,因爲它被解釋爲識別符



原文地址:【數據庫】Invalid default value for 'create_date' timestamp field
標籤:mysql   數據庫   NO_ZERO_IN_DATE   NO_ZERO_DATE   sql_node   

智能推薦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章