小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

關(guān)于數(shù)據(jù)庫中如何存儲時間的一點思考

 小世界的野孩子 2022-02-22

1.切記不要用字符串存儲日期

我記得我在大學(xué)的時候就這樣干過,而且現(xiàn)在很多對數(shù)據(jù)庫不太了解的新手也會這樣干,可見,這種存儲日期的方式的優(yōu)點還是有的,就是簡單直白,容易上手。

但是,這是不正確的做法,主要會有下面兩個問題:

  1. 字符串占用的空間更大!
  2. 字符串存儲的日期比較效率比較低(逐個字符進(jìn)行比對),無法用日期相關(guān)的 API 進(jìn)行計算和比較。

2.Datetime 和 Timestamp 之間抉擇

Datetime 和 Timestamp 是 MySQL 提供的兩種比較相似的保存時間的數(shù)據(jù)類型。他們兩者究竟該如何選擇呢?

通常我們都會首選 Timestamp。 下面說一下為什么這樣做!

2.1 DateTime 類型沒有時區(qū)信息的

DateTime 類型是沒有時區(qū)信息的(時區(qū)無關(guān)) ,DateTime 類型保存的時間都是當(dāng)前會話所設(shè)置的時區(qū)對應(yīng)的時間。這樣就會有什么問題呢?當(dāng)你的時區(qū)更換之后,比如你的服務(wù)器更換地址或者更換客戶端連接時區(qū)設(shè)置的話,就會導(dǎo)致你從數(shù)據(jù)庫中讀出的時間錯誤。不要小看這個問題,很多系統(tǒng)就是因為這個問題鬧出了很多笑話。

Timestamp 和時區(qū)有關(guān)。Timestamp 類型字段的值會隨著服務(wù)器時區(qū)的變化而變化,自動換算成相應(yīng)的時間,說簡單點就是在不同時區(qū),查詢到同一個條記錄此字段的值會不一樣。

下面實際演示一下!

建表 SQL 語句:

CREATE TABLE `time_zone_test` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `date_time` datetime DEFAULT NULL,
  `time_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入數(shù)據(jù):

INSERT INTO time_zone_test(date_time,time_stamp) VALUES(NOW(),NOW());

查看數(shù)據(jù):

select date_time,time_stamp from time_zone_test;

結(jié)果:

+---------------------+---------------------+
| date_time           | time_stamp          |
+---------------------+---------------------+
| 2020-01-11 09:53:32 | 2020-01-11 09:53:32 |
+---------------------+---------------------+

現(xiàn)在我們運行

修改當(dāng)前會話的時區(qū):

set time_zone='+8:00';

再次查看數(shù)據(jù):

+---------------------+---------------------+
| date_time           | time_stamp          |
+---------------------+---------------------+
| 2020-01-11 09:53:32 | 2020-01-11 17:53:32 |
+---------------------+---------------------+

擴(kuò)展:一些關(guān)于 MySQL 時區(qū)設(shè)置的一個常用 sql 命令

# 查看當(dāng)前會話時區(qū)
SELECT @@session.time_zone;
# 設(shè)置當(dāng)前會話時區(qū)
SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
# 數(shù)據(jù)庫全局時區(qū)設(shè)置
SELECT @@global.time_zone;
# 設(shè)置全局時區(qū)
SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';

2.2 DateTime 類型耗費空間更大

Timestamp 只需要使用 4 個字節(jié)的存儲空間,但是 DateTime 需要耗費 8 個字節(jié)的存儲空間。但是,這樣同樣造成了一個問題,Timestamp 表示的時間范圍更小。

  • 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

Timestamp 在不同版本的 MySQL 中有細(xì)微差別。

3 再看 MySQL 日期類型存儲空間

下圖是 MySQL 5.6 版本中日期類型所占的存儲空間:

可以看出 5.6.4 之后的 MySQL 多出了一個需要 0 ~ 3 字節(jié)的小數(shù)位。Datatime 和 Timestamp 會有幾種不同的存儲空間占用。

為了方便,本文我們還是默認(rèn) Timestamp 只需要使用 4 個字節(jié)的存儲空間,但是 DateTime 需要耗費 8 個字節(jié)的存儲空間。

4.數(shù)值型時間戳是更好的選擇嗎?

很多時候,我們也會使用 int 或者 bigint 類型的數(shù)值也就是時間戳來表示時間。

這種存儲方式的具有 Timestamp 類型的所具有一些優(yōu)點,并且使用它的進(jìn)行日期排序以及對比等操作的效率會更高,跨系統(tǒng)也很方便,畢竟只是存放的數(shù)值。缺點也很明顯,就是數(shù)據(jù)的可讀性太差了,你無法直觀的看到具體時間。

時間戳的定義如下:

時間戳的定義是從一個基準(zhǔn)時間開始算起,這個基準(zhǔn)時間是「1970-1-1 00:00:00 +0:00」,從這個時間開始,用整數(shù)表示,以秒計時,隨著時間的流逝這個時間整數(shù)不斷增加。這樣一來,我只需要一個數(shù)值,就可以完美地表示時間了,而且這個數(shù)值是一個絕對數(shù)值,即無論的身處地球的任何角落,這個表示時間的時間戳,都是一樣的,生成的數(shù)值都是一樣的,并且沒有時區(qū)的概念,所以在系統(tǒng)的中時間的傳輸中,都不需要進(jìn)行額外的轉(zhuǎn)換了,只有在顯示給用戶的時候,才轉(zhuǎn)換為字符串格式的本地時間。

數(shù)據(jù)庫中實際操作:

mysql> select UNIX_TIMESTAMP('2020-01-11 09:53:32');
+---------------------------------------+
| UNIX_TIMESTAMP('2020-01-11 09:53:32') |
+---------------------------------------+
|                            1578707612 |
+---------------------------------------+
1 row in set (0.00 sec)

mysql> select FROM_UNIXTIME(1578707612);
+---------------------------+
| FROM_UNIXTIME(1578707612) |
+---------------------------+
| 2020-01-11 09:53:32       |
+---------------------------+
1 row in set (0.01 sec)

5.總結(jié)

MySQL 中時間到底怎么存儲才好?Datetime?Timestamp? 數(shù)值保存的時間戳?

好像并沒有一個銀彈,很多程序員會覺得數(shù)值型時間戳是真的好,效率又高還各種兼容,但是很多人又覺得它表現(xiàn)的不夠直觀。這里插一嘴,《高性能 MySQL 》這本神書的作者就是推薦 Timestamp,原因是數(shù)值表示時間不夠直觀。下面是原文:

image

每種方式都有各自的優(yōu)勢,根據(jù)實際場景才是王道。下面再對這三種方式做一個簡單的對比,以供大家實際開發(fā)中選擇正確的存放時間的數(shù)據(jù)類型:

作者:Snailclimb
鏈接:關(guān)于數(shù)據(jù)庫中如何存儲時間的一點思考
來源:github

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多