資料庫儲存時間到底該用什麼型別?
“yes,最近設計一個新專案的資料庫表結構,別的專案以前的表,發現這個時間欄位型別都沒個統一,我有點麻了。”
老陳眨了眨他的眯眯眼,望向了我。
“是不是有用 int、有TIMESTAMP 還有 DATETIME 的?” 我早就發現了這個亂象,大家都各自設計各自的,沒個統一的型別。
“對對對,你說應該選哪個好?”
老陳又要給我送溫暖了,我趕緊回答道:“首先,這個 int 型別得先淘汰了,雖然從功能來說用 int 儲存時間戳沒毛病,不過最多就只能存到 2038 年,不過這也不知重點,今年才几几年,管那麼多,指不定到時候專案都 G了。”
“重點是,int 用不了 DEFAULT CURRENT_TIMESTAMP
和 ON UPDATE CURRENT_TIMESTAMP
。”
DEFAULT CURRENT_TIMESTAMP
當記錄插入的時候,如果沒有指定時間,那麼預設填入當前時間。
ON UPDATE CURRENT_TIMESTAMP
當記錄修改時,自動更新時間,相當於自動修改記錄的更新時間,不需要人為塞值。
這兩個玩意就很好使了,非常方便,不然相關的 SQL 你都得顯示的寫入插入和修改當前時間的語句。
麻煩!且容易漏!程式設計這玩意最重要的是簡單、便捷,花裡胡哨的都容易出錯。
老陳聽完,煞有其事地點了點頭,示意我繼續。
魚兒已經上鉤,我怎能輕易放過!
我故作停頓,瞟了眼他桌上的抗原檢測試劑,這玩意最近可是硬通貨,網上壓根買不著了。
老陳心領神會,雙手捧著一盒,輕輕地放在我的桌上。
我點了點頭,繼續說道:“至於 TIMESTAMP 的話,5.6版本以上支援 TIMESTAMP(N) N 表示秒的小數位,最高可達六位,不過它也只能存到 2038 年,本質上跟 int 一樣,都是時間戳,不過資料庫可以操作它進行時區的轉換!”
時間戳存的就是'1970-01-01 00:00:00' 到現在的毫秒數,沒有時區的概念,而 MySQL 的 TIMESTAMP 型別可以指定時區返回不同的時間。
簡單點,我拿 SELECT NOW()
來舉例不同時區的情況。
比如我現在不指定時區,預設就是作業系統的時區,返回的結果如下圖所示:
然後我現在整個把時區變成卡達的,你看看,時間是不是就變了?TIMESTAMP 就是有這樣的功效。
老陳定睛一看,冷不丁地冒出一句:“這丫的世界盃時間真不友好,老是在我們凌晨 3 點踢,你看看,熬的我都長痘痘了!破壞我英俊的臉龐!”
“話說回來,這時區功能不是必備的呀,我在服務端轉個時區不就得了嘛?”
我嫌棄地瞄了他一眼,忽略他的臭美:“沒錯,如果有分時區的需求,服務端直接轉時區塞給前端就行了,而且利用 MySQL 轉時區還有小坑!”
因為 TIMESTAMP 繫結了時區的屬性,所以每次都需要利用時區來計算時間,如果我們 MySQL 沒有指定時區,那麼預設就需要每次檢視作業系統的時區,就得呼叫作業系統底層的 __tz_convert
函式,會加鎖,而加鎖就意味著資源爭搶!
在高併發的時候,影響可能就會比較大了!
所以如果非要用 TIMESTAMP ,那麼記得在 MySQL 配置檔案中顯示設定時區!
“OKOK,那我就不用 int 也不用 TIMESTAMP ,就用 DATETIME 了!不會這玩意也不好使吧?”
我搓了搓手,又瞄向了他桌上剛收到的快遞,看這包裝好像是 KN95 口罩?
老陳順著我的目光,心疼地移步向前拆開包裝扔給了我一包,罵罵咧咧道:“這狗日的口罩,現在不僅難買還很貴,這玩意前不久還 1 塊錢,現在要 5 塊!真是些黑心商家!”
“可不嘛,我在網上下了十幾單,漲價我忍了,還都是預售的!發貨時間1-45天內....”我吐槽道,“行了,不扯這個,繼續說 DATETIME。”
DATETIME 沒有 2038 的限制,可以存到 9999-12-31 23:59:59
,也沒有時區屬性,並且支援 DEFAULT CURRENT_TIMESTAMP
和 ON UPDATE CURRENT_TIMESTAMP
。
DATETIME(N) 中的 N 表示秒的小數位,最高可達 6 位,也是 5.6 版本以上支援。
這個 N 可能光說你沒直觀的影響,我還是拿 SELECT NOW
舉個例子:
所以 DATETIME 其實沒啥缺點,如果非要說個的話可能就是空間的佔用了相比會大些了,看下下面這個圖:
對了,上圖還有個 DATE 型別,這個就不說了,只能儲存日期,無法儲存時分秒。
老陳摸了摸他的大光頭,“懂了,問就是 DATETIME!”
孺子可教!
我埋頭理了理桌上的 KN95 和抗原,美滋滋:“果然知識就是金錢啊!古人誠不欺我!”
更過故事,請聽下回分享!
有些同學如果私下在做實驗在設定時區時候可能會遇到 unknown variable 'time_zone=Asia/Qatar'
這樣的錯誤。
原因是你的 MySQL 沒有初始化時區相關的資訊,時區初始化的 sql 我放在公眾號後臺了,有興趣的回覆【時區】就能拿到檔案,適用於 5.7+版本,直接跑就行。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2928858/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 什麼時候該使用NoSQL儲存資料庫?SQL資料庫
- 資料庫到底應該如何儲存密碼?資料庫密碼
- 到底什麼是實時資料倉儲?
- 【資料庫】資料庫儲存元素型別基礎資料庫型別
- 資料庫mysql儲存是什麼?可以存什麼?資料庫MySql
- 【MySQL】時間型別儲存格式選擇MySql型別
- mysql儲存日期使用什麼型別MySql型別
- 資料庫是什麼意思?有什麼用?有哪些型別?資料庫型別
- MYSQL 資料型別儲存-數值型MySQL 資料型別
- 為什麼不用資料庫儲存圖片?資料庫
- Mysql資料庫學習(二):資料型別(數值型別 日期和時間型別 字串型別)MySql資料庫資料型別字串
- oracle資料型別data type與儲存空間大小(一)Oracle資料型別
- oracle資料型別data type與儲存空間大小(二)Oracle資料型別
- redis-4.資料儲存型別Redis型別
- MYSQL-資料型別儲存-DATEMySql資料型別
- JavaScript中的資料型別-儲存差別JavaScript資料型別
- 資料庫該學什麼!!!!資料庫
- 資料倉儲應該用什麼方案——資料倉儲實施方案概述
- 現在後端都在用什麼資料庫儲存資料?後端資料庫
- 資料倉儲、資料集市、資料湖、資料中臺到底有什麼區別?
- 資料庫與資料倉儲的區別是什麼資料庫
- Oracle基本資料型別儲存格式淺析——RAW型別Oracle資料型別
- PHP memcached 各種資料型別儲存PHP資料型別
- oracle資料型別與儲存結構Oracle資料型別
- 物件儲存、檔案儲存、塊儲存這三者之間有什麼區別?物件
- Redis的各種資料型別到底能玩出什麼花兒?Redis資料型別
- 【MySQL資料型別2之--日期時間型別】MySql資料型別
- 使用MongoDB儲存時間序列資料 - DACMongoDB
- 在資料倉儲建模時,應該使用哪種資料型別的度量值資料型別
- Oracle基本資料型別儲存格式淺析(五)——RAW型別Oracle資料型別
- python不同資料型別之間的區別有什麼?Python資料型別
- 資料庫倉庫系列:(一)什麼是資料倉儲,為什麼要資料倉儲資料庫
- Mysql - 如何決定用 datetime、timestamp、int 哪種型別儲存時間戳?MySql型別時間戳
- 如何延長儲存伺服器上資料的儲存時間?伺服器
- SAP EWM - 儲存型別 - 入庫控制型別
- SQL、Mysql、資料庫到底什麼關係MySql資料庫
- 資料庫儲存選型經驗總結資料庫
- Oracle基本資料型別儲存格式淺析(四)——ROWID型別Oracle資料型別