首頁 > 資料庫 > mysql教程 > MySQL資料庫怎麼實現儲存時間

MySQL資料庫怎麼實現儲存時間

WBOY
發布: 2023-06-03 16:00:21
轉載
1847 人瀏覽過


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

    字串佔用的空間更大!

    字串儲存的日期比較效率比較低(逐個字元進行比對),無法用日期相關的 API 進行計算和比較。

    2.Datetime 和 Timestamp 之間抉擇

    Datetime 和 Timestamp 是 MySQL 提供的兩種比較相似的保存時間的資料類型。

    他們兩個究竟該如何選擇呢?

    通常我們都會首選Timestamp

    2.1 DateTime 類型沒有時區資訊的

    DateTime 類型是沒有時區資訊的(時區無關)

    #當你的時區更換之後,例如你的伺服器更換位址或更換客戶端連線時區設定的話,就會導致你從資料庫中讀出的時間錯誤。

    Timestamp 和時區有關。

    Timestamp 類型欄位的值會隨著伺服器時區的變化而變化,自動換算成對應的時間,說簡單點就是在不同時區,查詢到同一個筆記錄此欄位的值會不一樣。

    下面實際示範一下!

    建表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;
    登入後複製

    插入資料:

    INSERT INTO time_zone_test(date_time,time_stamp) VALUES(NOW(),NOW());
    登入後複製

    檢視資料:

    select dsqlate_time,time_stamp from time_zone_test;
    登入後複製

    結果:








    ## --------------------- ---------------------
    | date_time           | time_stamp          |

    --------------------- ---------------------
    | 2020-01-11 09:53:32 | 2020-01-11 09:53:32 |

    --------------------- --- ------------------

    修改目前會話的時區:

    set time_zone='+8:00';
    登入後複製

    再次檢視資料:

    --------------------- ---------------------

    | date_time | time_stamp          |

    --------------------- ---------------------

    | 2020-01-11 09:53:32 | 2020-01-11 17:53:32 |

    --------------------- -- -------------------

      擴充功能:一些關於MySQL 時區設定的常用sql 指令
    • 1. 檢視目前會話時區

          SELECT @@session.time_zone;
      登入後複製

      2. 設定目前會話時區
    •     SET time_zone = 'Europe/Helsinki';
          SET time_zone = "+00:00";
      登入後複製
    • 3. 資料庫全域時區設定

          SELECT @@global.time_zone;
      登入後複製
      4. 設定全域時區
          SET GLOBAL time_zone = '+8:00';
          SET GLOBAL time_zone = 'Europe/Helsinki';
      登入後複製

      2.2 DateTime 類型耗費空間較大
    Timestamp 只需要使用4 個位元組的儲存空間,但DateTime 需要耗費8 個位元組的儲存空間。然而,這種方法也引發了一個問題,即 Timestamp 的時間範圍更為有限。

    DateTime

    :1000-01-01 00:00:00 ~ 9999-12-31 23:59:59

    MySQL資料庫怎麼實現儲存時間

    Timestamp

    : 1970-01-01 00:00:01 ~ 2037-12-31 23:59:59

    Timestamp 在不同版本的MySQL中有細微差別。

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

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

    可以看出5.6.4 之後的MySQL 多出了一個需要0 ~ 3 個位元組的小數位。 DataTime和Timestamp在儲存時會佔用不同的儲存空間。

    為了方便,本文我們還是預設 Timestamp 只需要使用 4 個位元組的儲存空間,但 DateTime 需要耗費 8 個位元組的儲存空間。

    4.數值型時間戳記是更好的選擇嗎?

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

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

    時間戳記的定義如下:MySQL資料庫怎麼實現儲存時間

    ######時間戳記的定義是從基準時間開始算起,這個基準時間是「1970-1-1 00:00:00 0:00”,從這個時間開始,用整數表示,以秒計時,隨著時間的流逝這個時間整數不斷增加。這樣一來,我只需要一個數值,就可以完美地表示時間了,而且這個數值是一個絕對數值,即無論的身處地球的任何角落,這個表示時間的時間戳,都是一樣的,生成的數值都是一樣的,而且沒有時區的概念,所以在系統的中時間的傳輸中,都不需要進行額外的轉換了,只有在顯示給使用者的時候,才轉換為字串格式的本地時間。 #########資料庫中實際操作:###
    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.總結#######推薦Timestamp,原因是數值表示時間不夠直觀######每種方式都有各自的優勢,根據實際場景才是王道。以下再對這三種方式做一個簡單的對比,以供大家實際開發中選擇正確的存放時間的資料類型:############

    6.设置mysql date类型字段默认值支持0000格式

    [mysqld]
    sql-mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    登入後複製

    以上是MySQL資料庫怎麼實現儲存時間的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    相關標籤:
    來源:yisu.com
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板