- 不要用字符串存儲(chǔ)日期
- DateTime和TimeStamp之間的選擇
2.1 DateTime沒(méi)有時(shí)區(qū)信息
2.2 DateTime類型耗費(fèi)更大的空間- 數(shù)值型時(shí)間戳
- 總結(jié)
1. 不要用字符串存儲(chǔ)日期
字符串存儲(chǔ)存在的問(wèn)題:
- 空間,字符串占用更大的空間
- 效率,字符串存儲(chǔ)日期效率較低(逐個(gè)字符比對(duì)),無(wú)法用日期相關(guān)的 API 進(jìn)行計(jì)算和比較。
2. DateTime和TimeStamp之間的選擇
通常首選Timestamp
2.1 DateTime沒(méi)有時(shí)區(qū)信息
DateTime 類型是沒(méi)有時(shí)區(qū)信息的(時(shí)區(qū)無(wú)關(guān)),DateTime 類型保存的時(shí)間都是當(dāng)前會(huì)話所設(shè)置的時(shí)區(qū)對(duì)應(yīng)的時(shí)間。所以當(dāng)時(shí)區(qū)更換之后,比如服務(wù)器更換地址或者更換客戶端連接時(shí)區(qū)設(shè)置的話,就會(huì)導(dǎo)致從數(shù)據(jù)庫(kù)中讀出的時(shí)間錯(cuò)誤。
Timestamp 和時(shí)區(qū)有關(guān)。Timestamp 類型字段的值會(huì)隨著服務(wù)器時(shí)區(qū)的變化而變化,自動(dòng)換算成相應(yīng)的時(shí)間,也就是說(shuō)在不同時(shí)區(qū),查詢到同一個(gè)條記錄此字段的值會(huì)不一樣。
一些關(guān)于MySQL時(shí)區(qū)設(shè)置一個(gè)常用sql命令
# 查看當(dāng)前會(huì)話時(shí)區(qū)
SELECT @@session.time_zone;
# 設(shè)置當(dāng)前會(huì)話時(shí)區(qū)
SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
# 數(shù)據(jù)庫(kù)全局時(shí)區(qū)設(shè)置
SELECT @@global.time_zone;
# 設(shè)置全局時(shí)區(qū)
SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
2.2 DateTime類型耗費(fèi)更大的空間
Timestamp 只需要使用 4 個(gè)字節(jié)的存儲(chǔ)空間,但是 DateTime 需要耗費(fèi) 8 個(gè)字節(jié)的存儲(chǔ)空間。但是,這樣同樣造成了一個(gè)問(wèn)題,Timestamp 表示的時(shí)間范圍更小。
- DateTime :1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
- Timestamp: 1970-01-01 00:00:01 ~ 2037-12-31 23:59:59
3. 數(shù)值型時(shí)間戳
有時(shí)也會(huì)用 int 或者 bigint 類型的數(shù)值也就是時(shí)間戳來(lái)表示時(shí)間。
這種存儲(chǔ)方式的具有 Timestamp 類型的所具有一些優(yōu)點(diǎn),并且使用它的進(jìn)行日期排序以及對(duì)比等操作的效率會(huì)更高,跨系統(tǒng)也很方便,畢竟只是存放的數(shù)值。缺點(diǎn)也很明顯,就是數(shù)據(jù)的可讀性太差了,你無(wú)法直觀的看到具體時(shí)間。

4. 總結(jié)
