問題
最近遇到一個這樣的問題,新建數據庫表的時候 提示 錯誤如下
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