电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

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

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

時間戳數據存取

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

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

時間戳字段定義

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

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

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

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

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

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

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

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

當建表語句中定于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;

當建表語句中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版本中主要差異受參數explicit_defaults_for_timestamp的默認值影響。

PS2:當時間戳列的默認值為’0000-00-00 00:00:00’時,使用“不在時間戳取值范圍內”的該默認值并不會產生警告。

時間戳類型引發的異常

當MySQL參數time_zone=system時,查詢timestamp字段會調用系統時區做時區轉換,而由于系統時區存在全局鎖問題,在多并發大數據量訪問時會導致線程上下文頻繁切換,CPU使用率暴漲,系統響應變慢設置假死。

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

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

在MySQL 5.6.4及之后版本,可以將時間戳類型(timestamp)數據最高精確微秒,也同樣可以將時間類型(datetime)數據最高精確微秒,時間類型(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’,能更好地存放各時間段的數據。

時間戳類型使用建議

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

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

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

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

建議將time_zone參數設置為system外的值,如中國地區服務器設置為’+8:00’;

建議將MySQL線下測試版本和線上生產版本保持一致。

Timestamp和datetime的異同

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

相同點:

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

不同點:

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

設置timestamp和date的自動更新時間

當對某條數據進行更新操作時或者插入一條新的數據而沒有對date和mydate進行賦值,date和mydate這兩個字段會自動默認為當前時間

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

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

解決方案

timestamp 雖然有上限限制,但是它保存的是時間戳,可以不用去考慮時區的問題,如果是需要處理與時區相關的需求, 解決 2038 限制的時候,建議將 timestamp改為整數類型,用來保存時間戳,在程序中再進行轉換(這個方案沒有實施過,僅僅是建議,慎用!!)
如果不需要考慮時區問題,直接用 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";

將原來字段列的數據拷貝到新的字段列中;

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

刪除原來的列;

ALTER TABLE `student` DROP `temp_entry_date`;

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

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`;

到此這篇關于Mysql的timestamp時間戳詳解及2038問題的文章就介紹到這了,更多相關Mysql timestamp時間戳內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: MySQL
主站蜘蛛池模板: 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | 润滑油加盟_润滑油厂家_润滑油品牌-深圳市沃丹润滑科技有限公司 琉璃瓦-琉璃瓦厂家-安徽盛阳新型建材科技有限公司 | 微动开关厂家-东莞市德沃电子科技有限公司 | 真空泵维修保养,普发,阿尔卡特,荏原,卡西亚玛,莱宝,爱德华干式螺杆真空泵维修-东莞比其尔真空机电设备有限公司 | 香港新时代国际美容美发化妆美甲培训学校-26年培训经验,值得信赖! | 识禅_对禅的了解,从这里开始 | 新疆十佳旅行社_新疆旅游报价_新疆自驾跟团游-新疆中西部国际旅行社 | 槽钢冲孔机,槽钢三面冲,带钢冲孔机-山东兴田阳光智能装备股份有限公司 | 钢衬四氟管道_钢衬四氟直管_聚四氟乙烯衬里管件_聚四氟乙烯衬里管道-沧州汇霖管道科技有限公司 | 全屋整木定制-橱柜,家具定制-四川峨眉山龙马木业有限公司 | 防爆电机-高压防爆电机-ybx4电动机厂家-河南省南洋防爆电机有限公司 | 彩超机-黑白B超机-便携兽用B超机-多普勒彩超机价格「大为彩超」厂家 | 济南冷库安装-山东冷库设计|建造|冷库维修-山东齐雪制冷设备有限公司 | 四川实木门_成都实木门 - 蓬溪聚成门业有限公司 | 防爆电机_ybx3系列电机_河南省南洋防爆电机有限公司 | 压片机_高速_单冲_双层_花篮式_多功能旋转压片机-上海天九压片机厂家 | 点焊机-缝焊机-闪光对焊机-电阻焊设备生产厂家-上海骏腾发智能设备有限公司 | 污水提升器,污水提升泵,污水提升装置-德国泽德(zehnder)水泵系统有限公司 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 搅拌磨|搅拌球磨机|循环磨|循环球磨机-无锡市少宏粉体科技有限公司 | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | 整合营销推广|营销网络推广公司|石家庄网站优化推广公司|智营销 好物生环保网、环保论坛 - 环保人的学习交流平台 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | 粘度计NDJ-5S,粘度计NDJ-8S,越平水分测定仪-上海右一仪器有限公司 | 防锈油-助焊剂-光学玻璃清洗剂-贝塔防锈油生产厂家 | 低温柔性试验仪-土工布淤堵-沥青车辙试验仪-莱博特(天津)试验机有限公司 | 单螺旋速冻机-双螺旋-流态化-隧道式-食品速冻机厂家-广州冰泉制冷 | 钢丝绳探伤仪-钢丝绳检测仪-钢丝绳探伤设备-洛阳泰斯特探伤技术有限公司 | 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 玖容气动液压设备有限公司-气液增压缸_压力机_增压机_铆接机_增压器 | 微信聊天记录恢复_手机短信删除怎么恢复_通讯录恢复软件下载-快易数据恢复 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 山东限矩型液力偶合器_液力耦合器易熔塞厂家-淄博市汇川源机械厂 | 必胜高考网_全国高考备考和志愿填报信息平台| 软文推广发布平台_新闻稿件自助发布_媒体邀约-澜媒宝 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 户外健身路径_小区健身器材_室外健身器材厂家_价格-浩然体育 | 油缸定制-液压油缸厂家-无锡大鸿液压气动成套有限公司 | 耐酸泵,耐腐蚀真空泵,耐酸真空泵-淄博华舜耐腐蚀真空泵有限公司 精密模具-双色注塑模具加工-深圳铭洋宇通 | 台湾Apex减速机_APEX行星减速机_台湾精锐减速机厂家代理【现货】-杭州摩森机电 |