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

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

Mysql的timestamp時間戳詳解及2038問題

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

時間戳是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現(xiàn)在的總秒數(shù)。
生產(chǎn)環(huán)境中部署著各種版本的MySQL,包括MySQL 5.5/5.6/5.7三個大版本和N個小版本,由于MySQL在向上兼容性較差,導(dǎo)致相同SQL在不同版本上表現(xiàn)各異,下面從幾個方面來詳細(xì)介紹時間戳數(shù)據(jù)類型。

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

在MySQL上述三個大版本中,默認(rèn)時間戳(Timestamp)類型的取值范圍為’1970-01-01 00:00:01’ UTC 至’2038-01-19 03:14:07’ UTC,數(shù)據(jù)精確到秒級別,該取值范圍包含約22億個數(shù)值,因此在MySQL內(nèi)部使用4個字節(jié)INT類型來存放時間戳數(shù)據(jù):
1、在存儲時間戳數(shù)據(jù)時,先將本地時區(qū)時間轉(zhuǎn)換為UTC時區(qū)時間,再將UTC時區(qū)時間轉(zhuǎn)換為INT格式的毫秒值(使用UNIX_TIMESTAMP函數(shù)),然后存放到數(shù)據(jù)庫中。
2、在讀取時間戳數(shù)據(jù)時,先將INT格式的毫秒值轉(zhuǎn)換為UTC時區(qū)時間(使用FROM_UNIXTIME函數(shù)),然后再轉(zhuǎn)換為本地時區(qū)時間,最后返回給客戶端。

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

時間戳字段定義

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

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

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

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

  • 當(dāng)字段定義為timestamp,表示該字段在插入和更新時都不會自動設(shè)置為當(dāng)前時間。
  • 當(dāng)字段定義為timestamp DEFAULT CURRENT_TIMESTAMP,表示該字段僅在插入且未指定值時被賦予當(dāng)前時間,再更新時且未指定值時不做修改。
  • 當(dāng)字段定義為timestamp ON UPDATE CURRENT_TIMESTAMP,表示該字段在插入且未指定值時被賦值為"0000-00-00 00:00:00",在更新且未指定值時更新為當(dāng)前時間。
  • 當(dāng)字段定義為timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,表示該字段在插入或更新時未指定值,則被賦值為當(dāng)前時間。

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

時間戳字段在MySQL各版本的使用差異

  • 在MySQL 5.5及之前版本中,僅能對一個時間戳字段定義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)建表語句中定于c1 timestamp 時,

  • 在MySQL 5.5中等價于c1 timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
  • 在MySQL 5.6中等價于c1 timestamp NULL DEFAULT NULL;
  • 在MySQL 5.7中等價于c1 timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

當(dāng)建表語句中c1 timestamp default 0時,

  • 在MySQL 5.5中等價于c1 timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’;
  • 在MySQL 5.6中等價于c1 timestamp NULL DEFAULT ‘0000-00-00 00:00:00’;
  • 在MySQL 5.7中等價于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)時間戳列的默認(rèn)值為’0000-00-00 00:00:00’時,使用“不在時間戳取值范圍內(nèi)”的該默認(rèn)值并不會產(chǎn)生警告。

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

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

時間戳類型和時間類型選擇

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

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

時間戳類型使用建議

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

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

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

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

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

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

Timestamp和datetime的異同

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

相同點:

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

不同點:

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

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

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

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問題

當(dāng) timestamp 存儲的時間大于 '2038-01-19 03:14:07' UTC,mysql就會報錯, 因為這是 mysql自身的問題,也就是說 timestamp是有上限的,超過了,自然會報錯, 具體原因查看官方文檔 : https://dev.mysql.com/doc/refman/8.0/en/datetime.html, 部分截圖如下:

解決方案

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

替換的思路:

1. 修改原來字段的名字;

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

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

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

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

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

刪除原來的列;

ALTER TABLE `student` DROP `temp_entry_date`;

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

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時間戳詳解及2038問題的文章就介紹到這了,更多相關(guān)Mysql timestamp時間戳內(nèi)容請搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

標(biāo)簽: MySQL
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
给我免费播放日韩视频| 成人精品中文字幕| 综合一区二区三区| 日韩精品一区二区三区免费观看| 欧美精品成人| 国产精品一区二区三区www| 国产亚洲久久| 久久影视三级福利片| 国产视频一区二| 国产欧美日韩精品一区二区免费 | 青草综合视频| 欧美日本二区| 久久精品国产99| 蜜臀久久精品| 亚洲激情欧美| 日本一区二区中文字幕| 国产精品日本一区二区不卡视频| 精品欧美视频| 久久中文亚洲字幕| 国产精品美女| 蜜臀av亚洲一区中文字幕| 欧美亚洲三区| 日产精品一区二区| 免费不卡中文字幕在线| 玖玖精品视频| 国产精品一区2区3区| 亚洲黄色中文字幕| 精品一区二区三区中文字幕视频 | 99在线观看免费视频精品观看| 中文不卡在线| 高清av不卡| 国产毛片久久久| 视频一区二区三区中文字幕| 国产精品一线天粉嫩av| 国产一区二区精品久| 视频小说一区二区| 亚洲一区欧美| 精品视频一区二区三区在线观看| 99久久视频| 日韩国产在线观看| 日韩精品诱惑一区?区三区| 久久国产精品久久w女人spa| 国产精品qvod| 精品一区免费| 国产精品一区二区三区www| 欧美国产91| 在线免费观看亚洲| 精品国产网站| 在线亚洲激情| 国产高清亚洲| 国产婷婷精品| 久久香蕉网站| 久久亚洲一区| 黑人精品一区| 青青青国产精品| 国模 一区 二区 三区| 日韩av一区二| 亚洲性视频h| 国产精品一区毛片| 中文日韩欧美| 国产一区二区三区四区二区| 欧美精品自拍| 精品国产鲁一鲁****| 青青久久av| 日韩一级欧洲| 视频一区中文| 六月丁香综合| 国产精品日韩精品中文字幕| 久久久久九九精品影院| 亚洲小说欧美另类婷婷| 午夜久久av| 久久中文精品| 久久久久97| 国产精品多人| 亚洲在线一区| 国产精品精品| 视频一区在线播放| 樱桃视频成人在线观看| 青青草视频一区| 美女91精品| 99tv成人| 日本一二区不卡| 国产精品第一| 日韩三级精品| 国产农村妇女精品一二区| 鲁鲁在线中文| 国产精品一国产精品k频道56| 久久午夜精品| 在线国产一区二区| 成人精品中文字幕| 国产精选在线| 国产情侣久久| 中文字幕日韩亚洲| 精品日韩毛片| 天堂日韩电影| 另类专区亚洲| 福利一区二区免费视频| 国产麻豆一区二区三区精品视频| 香蕉久久夜色精品国产| 精品亚洲美女网站| 久久精品亚洲| 国产精品久久久亚洲一区| 日韩在线网址| 婷婷五月色综合香五月| 蜜芽一区二区三区| 日韩视频中文| 成人在线网站| 黑人精品一区| 国产在线看片免费视频在线观看| 国产精品xxx| 欧美专区18| 亚洲男人在线| 国产色99精品9i| 免费亚洲一区| 98精品视频| 免费久久精品| 91综合视频| 欧美色图一区| 99久久亚洲精品| 黑丝美女一区二区| 婷婷亚洲综合| 久久精品中文| 亚洲精品在线影院| 久久夜夜操妹子| 三级精品视频| 免费av一区| 国产模特精品视频久久久久| 国产色综合网| 亚洲毛片网站| 亚洲丝袜美腿一区| 婷婷成人av| 国产精品嫩模av在线| 国产精品亚洲综合久久| 国产精品麻豆成人av电影艾秋 | 婷婷久久免费视频| 日韩av中文字幕一区二区| 欧美日韩伊人| 国产精品**亚洲精品| 久久精品亚洲一区二区| 黄在线观看免费网站ktv| 天堂网av成人| 欧美精品一线| 亚洲欧洲av| 亚洲一区二区三区久久久| 亚洲精品四区| 久久精品97| 日韩极品在线观看| 国产日韩欧美一区| 国产精品99久久免费观看| 美女视频黄 久久| 欧美激情综合| 高清精品久久| 国产一区二区三区久久| 里番精品3d一二三区| 国产精品.xx视频.xxtv| 日韩精品一区二区三区免费观看| 激情综合激情| 国产乱码精品| 成人三级高清视频在线看| 日韩av电影一区| 国产精品一区免费在线| 日韩国产在线不卡视频| 日韩av资源网| 9999国产精品| 国产精品天天看天天狠| 日本一不卡视频| 国产成人精品一区二区免费看京 | 91精品一区二区三区综合在线爱| 亚洲二区在线| 国产一区日韩欧美| 欧美一区二区三区高清视频| 一区二区三区四区在线看| 午夜欧美精品| 亚洲综合三区| 蜜桃视频一区二区| 国产精品一国产精品k频道56| 国产精品视频一区二区三区| 国产精品成人3p一区二区三区| 久久成人av| 亚洲网站视频| 亚洲主播在线| 深夜日韩欧美| 日韩欧美字幕| 欧美精品一二| 蜜臀国产一区二区三区在线播放| 国产激情久久| 国产伦精品一区二区三区在线播放| 亚洲tv在线| 国产精品22p| 高清不卡亚洲| 美女毛片一区二区三区四区最新中文字幕亚洲| 久久精品观看| 97精品中文字幕| 久久香蕉精品香蕉| 精品免费av一区二区三区| 欧美日韩一区二区三区不卡视频 | 午夜在线视频一区二区区别| 免播放器亚洲| 国产毛片精品| 亚洲一区二区三区免费在线观看|