日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Mysql的timestamp時(shí)間戳詳解及2038問(wèn)題

瀏覽:356日期:2023-05-05 10:12:00
目錄
  • 時(shí)間戳數(shù)據(jù)存取
  • 時(shí)間戳字段定義
  • 時(shí)間戳類型引發(fā)的異常
  • 時(shí)間戳類型和時(shí)間類型選擇
  • 時(shí)間戳類型使用建議
  • Timestamp和datetime的異同
  • 設(shè)置timestamp和date的自動(dòng)更新時(shí)間
  • 2038問(wèn)題
    • 解決方案

時(shí)間戳是指格林威治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總秒數(shù)。
生產(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è)置為T(mén)imestamp(3),如需要精確到微秒則設(shè)置為timestamp(6),數(shù)據(jù)精度提高的代價(jià)是其內(nèi)部存儲(chǔ)空間的變大,但仍未改變時(shí)間戳類型的最小和最大取值范圍。

時(shí)間戳字段定義

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

  • 插入記錄時(shí),時(shí)間戳字段包含DEFAULT CURRENT_TIMESTAMP,如插入記錄時(shí)未指定具體時(shí)間數(shù)據(jù)則將該時(shí)間戳字段值設(shè)置為當(dāng)前時(shí)間
  • 更新記錄時(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í)間戳列可以有四張組合定義,其含義分別為:

  • 當(dāng)字段定義為timestamp,表示該字段在插入和更新時(shí)都不會(huì)自動(dòng)設(shè)置為當(dāng)前時(shí)間。
  • 當(dāng)字段定義為timestamp DEFAULT CURRENT_TIMESTAMP,表示該字段僅在插入且未指定值時(shí)被賦予當(dāng)前時(shí)間,再更新時(shí)且未指定值時(shí)不做修改。
  • 當(dāng)字段定義為timestamp ON UPDATE CURRENT_TIMESTAMP,表示該字段在插入且未指定值時(shí)被賦值為"0000-00-00 00:00:00",在更新且未指定值時(shí)更新為當(dāng)前時(shí)間。
  • 當(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各版本的使用差異

  • 在MySQL 5.5及之前版本中,僅能對(duì)一個(gè)時(shí)間戳字段定義DEFUALT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP,但在MySQL 5.6和MySQL 5.7版本中取消了該限制;
  • 在MySQL 5.6版本中參數(shù)explicit_defaults_for_timestamp默認(rèn)值為1,在MySQL 5.7版本中參數(shù)explicit_defaults_for_timestamp默認(rèn)值為0;
  • 在MySQL 5.5和MySQL 5.7版本中timestamp類型默認(rèn)為NOT NULL,在在MySQL 5.6版本中timestamp類型默認(rèn)為NULL;

當(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;

當(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é),但隨著磁盤(pán)性能提升和內(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í)間戳類型使用建議

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

在關(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í)間;

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

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

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

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

Timestamp和datetime的異同

參考鏈接:https://www.jb51.net/article/223960.htm

相同點(diǎn):

  • 可自動(dòng)更新和初始化,默認(rèn)顯示格式相同YYYY-MM-dd HH:mm:ss

不同點(diǎn):

  • timestamp的時(shí)間范圍是:‘1970-01-01 00:00:01’ UTC to ‘2038-01-19 03:14:07’ UTC ,自動(dòng)時(shí)區(qū)轉(zhuǎn)化,實(shí)際存儲(chǔ)毫秒數(shù),4字節(jié)存儲(chǔ)
  • datetime的時(shí)間范圍:‘1000-01-01 00:00:00’ to ‘9999-12-31 23:59:59’ ,不支持時(shí)區(qū),8字節(jié)存儲(chǔ)

設(shè)置timestamp和date的自動(dòng)更新時(shí)間

當(dāng)對(duì)某條數(shù)據(jù)進(jìn)行更新操作時(shí)或者插入一條新的數(shù)據(jù)而沒(méi)有對(duì)date和mydate進(jìn)行賦值,date和mydate這兩個(gè)字段會(huì)自動(dòng)默認(rèn)為當(dāng)前時(shí)間

CREATE TABLE `mytime` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `date` timestamp(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),  `mydate` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

2038問(wèn)題

當(dāng) timestamp 存儲(chǔ)的時(shí)間大于 '2038-01-19 03:14:07' UTC,mysql就會(huì)報(bào)錯(cuò), 因?yàn)檫@是 mysql自身的問(wèn)題,也就是說(shuō) timestamp是有上限的,超過(guò)了,自然會(huì)報(bào)錯(cuò), 具體原因查看官方文檔 : https://dev.mysql.com/doc/refman/8.0/en/datetime.html, 部分截圖如下:

解決方案

timestamp 雖然有上限限制,但是它保存的是時(shí)間戳,可以不用去考慮時(shí)區(qū)的問(wèn)題,如果是需要處理與時(shí)區(qū)相關(guān)的需求, 解決 2038 限制的時(shí)候,建議將 timestamp改為整數(shù)類型,用來(lái)保存時(shí)間戳,在程序中再進(jìn)行轉(zhuǎn)換(這個(gè)方案沒(méi)有實(shí)施過(guò),僅僅是建議,慎用?。。?br>如果不需要考慮時(shí)區(qū)問(wèn)題,直接用 datatime類型替換 timestamp即可,因?yàn)閐atatime的取值范圍大很多,可看上圖;

替換的思路:

1. 修改原來(lái)字段的名字;

ALTER TABLE `student` CHANGE `entry_date` `temp_entry_date` timestamp NOT NULL default "0000-00-00 00:00:00";

新建一個(gè) datatime類型的字段(新建一列,用來(lái)替換原來(lái)的);

ALTER TABLE `student` ADD `entry_date` DATETIME NOT NULL default "0000-00-00 00:00:00";

將原來(lái)字段列的數(shù)據(jù)拷貝到新的字段列中;

UPDATE `student` SET `entry_date` = `temp_entry_date`;

刪除原來(lái)的列;

ALTER TABLE `student` DROP `temp_entry_date`;

完整sql 如下:(需要注意,原來(lái)的 timestamp的默認(rèn)值,這個(gè)也需要加上)

ALTER TABLE `student` CHANGE `entry_date` `temp_entry_date` timestamp NOT NULL default "0000-00-00 00:00:00";ALTER TABLE `student` ADD `entry_date` DATETIME NOT NULL default "0000-00-00 00:00:00";UPDATE `student` SET `entry_date` = `temp_entry_date`;ALTER TABLE `student` DROP `temp_entry_date`;

到此這篇關(guān)于Mysql的timestamp時(shí)間戳詳解及2038問(wèn)題的文章就介紹到這了,更多相關(guān)Mysql timestamp時(shí)間戳內(nèi)容請(qǐng)搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

標(biāo)簽: MySQL
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲欧美日本日韩| 久久午夜影院| 国产日韩一区二区三区在线播放| 久久九九精品| 日韩av片子| 日本黄色精品| 蜜桃精品在线| 色爱综合av| 久久一区二区中文字幕| 欧美肉体xxxx裸体137大胆| 久久精品卡一| 性欧美精品高清| 石原莉奈一区二区三区在线观看| 神马午夜在线视频| 成人三级高清视频在线看| 成人国产精品一区二区网站| 成人国产精选| 91精品久久久久久久久久不卡| 亚洲va中文在线播放免费| 久久久亚洲一区| 91久久国产| 综合欧美亚洲| 国产精品videossex久久发布 | 久久高清国产| 91综合久久爱com| 日韩av在线播放网址| 免费黄色成人| 日本aⅴ亚洲精品中文乱码| 免费看av不卡| 日韩精品一级| 99精品在线观看| 日韩av一区二区三区| 久久精品91| 国产精品久久久久久久久久齐齐 | 91视频一区| 色综合www| 日韩毛片一区| 快播电影网址老女人久久| 亚洲一区有码| 日韩综合一区| 日本午夜精品视频在线观看| 久久精品免费一区二区三区| 青草国产精品| 香蕉国产精品| 免费亚洲婷婷| 亚洲毛片一区| 米奇777超碰欧美日韩亚洲| 国产免费久久| 亚洲精品乱码久久久久久蜜桃麻豆| 伊人久久视频| 日本欧美久久久久免费播放网| 国产99久久久国产精品成人免费| 国产精品一级在线观看| 亚洲欧美久久久| 五月天激情综合网| 中文字幕在线视频久| 久久成人av| 亚洲精品一级二级三级| 视频在线不卡免费观看| 国产精品调教| 国产伦理一区| 国产精品视频一区二区三区综合 | 日韩精品第二页| 亚洲国内欧美| 美女久久久久| 久久久天天操| 久久国产主播| 成人看片网站| 亚洲天堂成人| 国产亚洲福利| 免费看欧美美女黄的网站| 最新日韩欧美| 久久成人国产| 日韩一区二区三区免费视频| 伊人久久一区| 91免费精品国偷自产在线在线| 91欧美极品| 久久精品国产在热久久| 国产精品久久亚洲不卡| 精品国产欧美日韩一区二区三区| 精品视频亚洲| 香蕉久久99| 日韩精品三级| 亚洲一区资源| 久色成人在线| 国产精品欧美日韩一区| 91精品一区国产高清在线gif | 精品国产三区在线| 日韩成人精品一区二区| 视频一区中文| 欧美精品中文字幕亚洲专区| 日本不良网站在线观看| 激情婷婷欧美| 偷拍亚洲精品| 午夜av不卡| 婷婷精品在线观看| 成人国产精品久久| 日韩中文欧美在线| 开心激情综合| 国产视频一区免费看| 欧美日本久久| 日韩一区二区免费看| 国产色99精品9i| 久久精品亚洲欧美日韩精品中文字幕| 久久av一区| 日韩欧美在线中字| 国产精品亚洲四区在线观看| 欧美日韩国产欧| 另类欧美日韩国产在线| 亚洲综合二区| 国产传媒av在线| 国产日韩欧美三区| 夜久久久久久| 日韩在线中文| 麻豆精品久久| 91精品国产自产观看在线| 婷婷激情图片久久| 日本不卡免费高清视频在线| 亚洲人成在线影院| 国精品一区二区三区| 欧美91在线|欧美| 青青国产91久久久久久| 亚洲一二av| 欧美专区18| 99在线|亚洲一区二区| 涩涩av在线| 国产在线观看91一区二区三区 | 老司机久久99久久精品播放免费| 精品亚洲美女网站| 中文字幕成在线观看| 国产一区二区三区视频在线| 中文字幕av一区二区三区四区| 亚洲午夜一级| 亚洲电影在线| 婷婷丁香综合| 91成人精品| 视频一区二区三区中文字幕| 亚洲欧美激情诱惑| 蜜臀久久久99精品久久久久久| 亚洲精品小说| 综合国产视频| 日韩中文字幕| 亚洲精品无播放器在线播放| 亚洲专区欧美专区| 在线观看视频免费一区二区三区| 亚洲一区成人| 一区二区三区网站| 亚洲啊v在线免费视频| 青草av.久久免费一区| 欧美韩一区二区| 色在线视频观看| 模特精品在线| 久久精品国产精品亚洲毛片| 国产福利电影在线播放| 不卡在线一区二区| 亚洲毛片网站| 国产aa精品| 免费视频久久| 精品国产一区二区三区av片| 欧美成人日韩| 日本免费一区二区视频| 欧美激情三区| 欧美日韩视频| 麻豆精品视频在线| 亚洲国产日韩欧美在线| 日韩激情综合| 成人精品中文字幕| 欧美日韩亚洲一区二区三区在线| 日本蜜桃在线观看视频| 亚洲无线观看| 日韩欧美中文| 国产精品蜜月aⅴ在线| 欧美一区二区三区激情视频| 久久99青青| 蜜桃视频一区二区| 亚洲91视频| 精品国产一区二区三区av片| 色8久久久久| 视频一区视频二区中文| 99久久视频| 国产精品久久久久久久久久10秀| 91嫩草精品| 亚洲精品视频一二三区| 精品亚洲美女网站| 精品三区视频| 国产精品白浆| 欧美国产免费| 国产精品a久久久久| 亚洲专区在线| 蜜桃视频欧美| 日韩在线二区| 国产一区福利| 精品久久久网| 久久av免费| 欧美成人精品一级| 麻豆精品国产91久久久久久| 日本91福利区| 欧美一级全黄| 国产亚洲久久| 国产精品欧美大片|