在MySQL 5.6.6之前,TIMESTAMP的默認(rèn)行為:
TIMESTAMP列如果沒(méi)有明確聲明NULL屬性,默認(rèn)為NOT NULL。(而其他數(shù)據(jù)類(lèi)型,如果沒(méi)有顯示聲明為NOT NULL,則允許NULL值。)設(shè)置TIMESTAMP的列值為NULL,會(huì)自動(dòng)存儲(chǔ)為當(dāng)前timestamp。
表中的第一個(gè)TIMESTAMP列,如果沒(méi)有聲明NULL屬性、DEFAULT或者 ON UPDATE,會(huì)自動(dòng)分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 屬性。
表中第二個(gè)TIMESTAMP列,如果沒(méi)有聲明為NULL或者DEFAULT子句,默認(rèn)自動(dòng)分配'0000-00-00 00:00:00′。插入行時(shí)沒(méi)有指明改列的值,該列默認(rèn)分配'0000-00-00 00:00:00′,且沒(méi)有警告。
2列TIMESTAMP未聲明為NULL的默認(rèn)行為
從MySQL5.6.6開(kāi)始這種默認(rèn)設(shè)置的方法被廢棄了。在MySQL啟動(dòng)時(shí)會(huì)出現(xiàn)以下警告:
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
Please use --explicit_defaults_for_timestamp server option
(seedocumentation for more details).
關(guān)閉警告,在my.cnf中加入
[mysqld]
explicit_defaults_for_timestamp=true
重啟MySQL后錯(cuò)誤消失,這時(shí)TIMESTAMP的行為如下:
TIMESTAMP如果沒(méi)有顯示聲明NOT NULL,是允許NULL值的,可以直接設(shè)置改列為NULL,而沒(méi)有默認(rèn)填充行為。
TIMESTAMP不會(huì)默認(rèn)分配DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP屬性。
MySQL5.6-INNODB-timestampTIMESTAMP 不設(shè)置是否為NULL
聲明為NOT NULL且沒(méi)有默認(rèn)子句的TIMESTAMP列是沒(méi)有默認(rèn)值的。往數(shù)據(jù)表中插入列,又沒(méi)有給TIMESTAMP列賦值時(shí),如果是嚴(yán)格SQL模式,會(huì)拋出一個(gè)錯(cuò)誤,如果嚴(yán)格SQL模式?jīng)]有啟用,該列會(huì)賦值為'0000-00-00 00:00:00′,同時(shí)出現(xiàn)一個(gè)警告。(這和MySQL處理其他時(shí)間類(lèi)型數(shù)據(jù)一樣,如DATETIME)
TIMESTAMP 默認(rèn)設(shè)置為NOT NULL
Note:
以上內(nèi)容和存儲(chǔ)引擎選擇無(wú)關(guān)。
MySQL從5.5升級(jí)到5.6,TIMESTAMP的變化
前言
前段時(shí)間,系統(tǒng)MySQL從5.5升級(jí)到了5.6,系統(tǒng)出現(xiàn)了大量的異常。大部分異常引起原因是由于TIMESTAMP的行為發(fā)生了變化。
TIMESTAMP在MySQL5.5中的行為
第一個(gè)未設(shè)置默認(rèn)值的TIMESTAMP NOT NULL字段隱式默認(rèn)值:
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 后面未設(shè)置默認(rèn)值的TIMESTAMP NOT NULL字段隱式默認(rèn)值:
0000-00-00 00:00:00 TIMESTAMP NOT NULL字段插入NULL時(shí),會(huì)使用隱式默認(rèn)值:
CURRENT_TIMESTAMP 不支持多個(gè)CURRENT_TIMESTAMP 默認(rèn)值
TIMESTAMP在MySQL5.6中的行為
支持多個(gè)CURRENT_TIMESTAMP 默認(rèn)值 可以兼容5.5的行為,支持隱性默認(rèn)值
explicit_defaults_for_timestamp=0 我測(cè)試安裝的MySQL5.6默認(rèn)使用這個(gè)參數(shù),啟動(dòng)時(shí),服務(wù)器會(huì)給出一個(gè)警告。
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use –explicit_defaults_for_timestamp server option (see documentation for more details).
可以去掉隱性默認(rèn)值
explicit_defaults_for_timestamp=1
總結(jié)
MySQL5.5中TIMESTAMP行為是比較詭異的,會(huì)造成一些隱含的問(wèn)題,比如程序中傳入了NULL值 MySQL5.6中可以將TIMESTAMP的行為變得正常,但會(huì)存在兼容問(wèn)題 explicit_defaults_for_timestamp參數(shù)未來(lái)會(huì)消失 我們不要過(guò)度依賴(lài)數(shù)據(jù)庫(kù)的特性,這些特性會(huì)給應(yīng)用程序造成掣肘