<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
時間戳是指格林威治時間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),資料精度提高的代價是其內部儲存空間的變大,但仍未改變時間戳型別的最小和最大取值範圍。
時間戳欄位定義主要影響兩類操作:
PS1:CURRENT_TIMESTAMP表示使用CURRENT_TIMESTAMP()函數來獲取當前時間,類似於NOW()函數
根據上面兩類操作,時間戳列可以有四張組合定義,其含義分別為:
PS1:在MySQL中執行的建表語句和最終表建立語句會存在差異,建議使用SHOW CREATE TABLE TB_XXX獲取已建立表的建表語句。
時間戳欄位在MySQL各版本的使用差異
當建表語句中定於c1 timestamp 時,
當建表語句中c1 timestamp default 0時,
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線下測試版本和線上生產版本保持一致。
參考連結:https://www.jb51.net/article/223960.htm
相同點:
不同點:
當對某條資料進行更新操作時或者插入一條新的資料而沒有對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;
當 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時間戳內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45