免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
MySQL的時(shí)間戳timestamp datetime

轉(zhuǎn)載

生產(chǎn)環(huán)境中部署著各種版本的MySQL,包括MySQL 5.5/5.6/5.7三個(gè)大版本和N個(gè)小版本,由于MySQL在向上兼容性較差,導(dǎo)致相同SQL在不同版本上表現(xiàn)各異,下面從幾個(gè)方面來(lái)詳細(xì)介紹時(shí)間戳數(shù)據(jù)類型。

 

時(shí)間戳數(shù)據(jù)存取

  在MySQL上述三個(gè)大版本中,默認(rèn)時(shí)間戳(Timestamp)類型的取值范圍為'1970-01-01 00:00:01' UTC 至'2038-01-19 03:14:07' UTC,數(shù)據(jù)精確到秒級(jí)別,該取值范圍包含約22億個(gè)數(shù)值,因此在MySQL內(nèi)部使用4個(gè)字節(jié)INT類型來(lái)存放時(shí)間戳數(shù)據(jù):

    1、在存儲(chǔ)時(shí)間戳數(shù)據(jù)時(shí),先將本地時(shí)區(qū)時(shí)間轉(zhuǎn)換為UTC時(shí)區(qū)時(shí)間,再將UTC時(shí)區(qū)時(shí)間轉(zhuǎn)換為INT格式的毫秒值(使用UNIX_TIMESTAMP函數(shù)),然后存放到數(shù)據(jù)庫(kù)中。

    2、在讀取時(shí)間戳數(shù)據(jù)時(shí),先將INT格式的毫秒值轉(zhuǎn)換為UTC時(shí)區(qū)時(shí)間(使用FROM_UNIXTIME函數(shù)),然后再轉(zhuǎn)換為本地時(shí)區(qū)時(shí)間,最后返回給客戶端。

 

  在MySQL 5.6.4及之后版本,可以將時(shí)間戳類型數(shù)據(jù)最高精確微秒(百萬(wàn)分之一秒),數(shù)據(jù)類型定義為timestamp(N),N取值范圍為0-6,默認(rèn)為0,如需要精確到毫秒則設(shè)置為Timestamp(3),如需要精確到微秒則設(shè)置為timestamp(6),數(shù)據(jù)精度提高的代價(jià)是其內(nèi)部存儲(chǔ)空間的變大,但仍未改變時(shí)間戳類型的最小和最大取值范圍。

 

 

 

時(shí)間戳字段定義

  時(shí)間戳字段定義主要影響兩類操作:

  1、插入記錄時(shí),時(shí)間戳字段包含DEFAULT CURRENT_TIMESTAMP,如插入記錄時(shí)未指定具體時(shí)間數(shù)據(jù)則將該時(shí)間戳字段值設(shè)置為當(dāng)前時(shí)間

  2、更新記錄時(shí),時(shí)間戳字段包含ON UPDATE CURRENT_TIMESTAMP,如更新記錄時(shí)未指定具體時(shí)間數(shù)據(jù)則將該時(shí)間戳字段值設(shè)置為當(dāng)前時(shí)間

 

  PS1:CURRENT_TIMESTAMP表示使用CURRENT_TIMESTAMP()函數(shù)來(lái)獲取當(dāng)前時(shí)間,類似于NOW()函數(shù)

 

  根據(jù)上面兩類操作,時(shí)間戳列可以有四張組合定義,其含義分別為:

  1、當(dāng)字段定義為timestamp,表示該字段在插入和更新時(shí)都不會(huì)自動(dòng)設(shè)置為當(dāng)前時(shí)間。

  2、當(dāng)字段定義為timestamp DEFAULT CURRENT_TIMESTAMP,表示該字段僅在插入且未指定值時(shí)被賦予當(dāng)前時(shí)間,再更新時(shí)且未指定值時(shí)不做修改。

  3、當(dāng)字段定義為timestamp ON UPDATE CURRENT_TIMESTAMP,表示該字段在插入且未指定值時(shí)被賦值為"0000-00-00 00:00:00",在更新且未指定值時(shí)更新為當(dāng)前時(shí)間。

  4、當(dāng)字段定義為timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,表示該字段在插入或更新時(shí)未指定值,則被賦值為當(dāng)前時(shí)間。

 

  PS1:在MySQL中執(zhí)行的建表語(yǔ)句和最終表創(chuàng)建語(yǔ)句會(huì)存在差異,建議使用SHOW CREATE TABLE TB_XXX獲取已創(chuàng)建表的建表語(yǔ)句。

 

時(shí)間戳字段在MySQL各版本的使用差異

  1、在MySQL 5.5及之前版本中,僅能對(duì)一個(gè)時(shí)間戳字段定義DEFUALT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP,但在MySQL 5.6和MySQL 5.7版本中取消了該限制;

  2、在MySQL 5.6版本中參數(shù)explicit_defaults_for_timestamp默認(rèn)值為1,在MySQL 5.7版本中參數(shù)explicit_defaults_for_timestamp默認(rèn)值為0;

  3、在MySQL 5.5和MySQL 5.7版本中timestamp類型默認(rèn)為NOT NULL,在在MySQL 5.6版本中timestamp類型默認(rèn)為NULL;

  4、當(dāng)建表語(yǔ)句中定于c1 timestamp 時(shí),

    在MySQL 5.5中等價(jià)于`c1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

    在MySQL 5.6中等價(jià)于`c1` timestamp NULL DEFAULT NULL;

    在MySQL 5.7中等價(jià)于`c1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

  5、當(dāng)建表語(yǔ)句中c1 timestamp default 0時(shí),

    在MySQL 5.5中等價(jià)于`c1` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';

    在MySQL 5.6中等價(jià)于`c1` timestamp NULL DEFAULT '0000-00-00 00:00:00';

    在MySQL 5.7中等價(jià)于`c1` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';

   

  PS1: MySQL 5.6版本和MySQL 5.7版本中主要差異受參數(shù)explicit_defaults_for_timestamp的默認(rèn)值影響。

  PS2:當(dāng)時(shí)間戳列的默認(rèn)值為'0000-00-00 00:00:00'時(shí),使用“不在時(shí)間戳取值范圍內(nèi)”的該默認(rèn)值并不會(huì)產(chǎn)生警告。

 

 

時(shí)間戳類型引發(fā)的異常

  當(dāng)MySQL參數(shù)time_zone=system時(shí),查詢timestamp字段會(huì)調(diào)用系統(tǒng)時(shí)區(qū)做時(shí)區(qū)轉(zhuǎn)換,而由于系統(tǒng)時(shí)區(qū)存在全局鎖問(wèn)題,在多并發(fā)大數(shù)據(jù)量訪問(wèn)時(shí)會(huì)導(dǎo)致線程上下文頻繁切換,CPU使用率暴漲,系統(tǒng)響應(yīng)變慢設(shè)置假死。

 

 

時(shí)間戳類型和時(shí)間類型選擇

  在部分"數(shù)據(jù)庫(kù)指導(dǎo)"文檔中,會(huì)推薦使用timestamp類型代替datetime字段,其理由是timestamp類型使用4字節(jié),而datetime字段使用8字節(jié),但隨著磁盤性能提升和內(nèi)存成本降低,在實(shí)際生產(chǎn)環(huán)境中,使用timestamp類型并不會(huì)帶來(lái)太多性能提升,反而可能因timestamp類型的定義和取值范圍限制和影響業(yè)務(wù)使用。

 

  在MySQL 5.6.4及之后版本,可以將時(shí)間戳類型(timestamp)數(shù)據(jù)最高精確微秒,也同樣可以將時(shí)間類型(datetime)數(shù)據(jù)最高精確微秒,時(shí)間類型(datetime)同樣可以獲得timestamp類型相同的效果,如將字段定義為 dt1 DATETIME(3) NOT NULL DEFAULT NOW(3) ON UPDATE NOW(3); 時(shí)間類型(datetime)的存取范圍'1000-01-01 00:00:00.000000' 至 '9999-12-31 23:59:59.999999',能更好地存放各時(shí)間段的數(shù)據(jù)。

 

 

時(shí)間戳類型使用建議

  1、在只關(guān)心數(shù)據(jù)最后更新時(shí)間的情況下,建議將時(shí)間戳列定義為TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

  2、在關(guān)心創(chuàng)建時(shí)間和更新時(shí)間的情況下,建議將更新時(shí)間設(shè)置為時(shí)間戳字段,將創(chuàng)建時(shí)間定義為DAETIME 或 TIMESTAMP DEFAULT '0000-00-00 00:00:00',并在插入記錄時(shí)顯式指定創(chuàng)建時(shí)間;

  3、建議在表中只定義單個(gè)時(shí)間戳列,并顯式定義DEFAULT 和 ON UPDATE屬性;

  4、雖然在MySQL中可以對(duì)時(shí)間戳字段賦值或更新,但建議僅在必要的情況下對(duì)時(shí)間戳列進(jìn)行顯式插入和更新;

  5、建議將time_zone參數(shù)設(shè)置為system外的值,如中國(guó)地區(qū)服務(wù)器設(shè)置為'+8:00';

  6、建議將MySQL線下測(cè)試版本和線上生產(chǎn)版本保持一致。


本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
警告!別再使用 TIMESTAMP 作為日期字段
MySQL里面的時(shí)間類型datetime,date,timestamp,time和y
關(guān)于數(shù)據(jù)庫(kù)中如何存儲(chǔ)時(shí)間的一點(diǎn)思考
mysql TIMESTAMP 不能為NULL
MySQL timestamp時(shí)間戳自動(dòng)更新時(shí)間的問(wèn)題
關(guān)于Mysql的日期類型字段設(shè)置默認(rèn)值為當(dāng)前日期的解決方案
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服