MySql系统变量explicit_defaults_for_timestamp
之前沒太注意timestamp這個數(shù)據(jù)類型,有個坑就是在默認(rèn)值上,MySql-5.6.6棄用了explicit_defaults_for_timestamp這個系統(tǒng)變量。我的版本卻高于5.6.6,所以就掉進去了,囧。
如果你的mysql版本高于5.6.6,在創(chuàng)建下表時,報ERROR 1067 (42000): Invalid default value for 'ctime'
create table mytime (id int,atime timestamp not null,ctime timestamp not null );那么恭喜中槍了!
看看mysql官網(wǎng)上的官網(wǎng)解釋吧:
timestamp.png
從圖中可以看出來,explicit_default_for_timestamp是解決這個問題的關(guān)鍵點。
當(dāng)explicit_defaults_for_timestamp=false時,按照如下規(guī)則"初始化":
off_default_timestamp.png
- 未明確聲明為NULL屬性的TIMESTAMP列被分配為NOT NULL屬性。 (其他數(shù)據(jù)類型的列,如果未顯式聲明為NOT NULL,則允許NULL值。)將此列設(shè)置為NULL將其設(shè)置為當(dāng)前時間戳。
- 表中的第一個TIMESTAMP列(如果未聲明為NULL屬性或顯式DEFAULT或ON UPDATE子句)將自動分配DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP屬性。
- 第一個之后的TIMESTAMP列(如果未聲明為NULL屬性或顯式DEFAULT子句)將自動分配DEFAULT'0000-00-00 00:00:00'(“零”時間戳)。 對于不指定此列的顯式值的插入行,該列將分配“0000-00-00 00:00:00”,并且不會發(fā)生警告。
當(dāng)explicit_defaults_for_timestamp=true時,按照如下規(guī)則"初始化":
no_default_timestamp.png
- 未明確聲明為NOT NULL的TIMESTAMP列允許NULL值。 將此列設(shè)置為NULL將其設(shè)置為NULL,而不是當(dāng)前時間戳。
- 沒有TIMESTAMP列自動分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP屬性。 必須明確指定這些屬性。
- 聲明為NOT NULL且沒有顯式DEFAULT子句的TIMESTAMP列被視為沒有默認(rèn)值。 對于不為此列指定顯式值的插入行,結(jié)果取決于SQL模式。 如果啟用了嚴(yán)格的SQL模式,則會發(fā)生錯誤。 如果未啟用嚴(yán)格的SQL模式,則會為列分配隱式默認(rèn)值“0000-00-00 00:00:00”,并發(fā)出警告。 這類似于MySQL如何處理其他時間類型,如DATETIME。
解決方法
在my.cnf中添加或修改explicit_defaults_for_timestamp=true
注:修改時不一定在my.cnf中,而是在my.cnf中指定的文件中,我的是寫在指定的子文件中的,一開始修改時也挺蒙圈的,附一段內(nèi)容,方便查找修改。
mysql_my_cnf.png
修改完文件,使文件生效后,再試試創(chuàng)建上面的表,就ok啦~
作者:x_zhaohu
鏈接:https://www.jianshu.com/p/d7d364745173
來源:簡書
總結(jié)
以上是生活随笔為你收集整理的MySql系统变量explicit_defaults_for_timestamp的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA 设计模式 : 状态模式
- 下一篇: 日期格式化{0:yyyy-MM-dd H