中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL數據庫怎么實現存儲時間

發布時間:2022-03-25 10:43:00 來源:億速云 閱讀:156 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關MySQL數據庫怎么實現存儲時間,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。


    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

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

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

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

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

    MySQL數據庫怎么實現存儲時間

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

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

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

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

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

    時間戳的定義如下:

    時間戳的定義是從一個基準時間開始算起,這個基準時間是「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,原因是數值表示時間不夠直觀

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

    MySQL數據庫怎么實現存儲時間

    6.設置mysql date類型字段默認值支持0000格式

    [mysqld]
    sql-mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

    關于“MySQL數據庫怎么實現存儲時間”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    临潭县| 临海市| 朝阳县| 乌苏市| 静海县| 额尔古纳市| 怀仁县| 海淀区| 遵义县| 鄂托克旗| 车险| 康定县| 忻州市| 色达县| 英超| 沐川县| 峨山| 疏勒县| 金塔县| 汽车| 福海县| 维西| 赤水市| 碌曲县| 芷江| 昭觉县| 海丰县| 潮州市| 兰考县| 阿城市| 秀山| 景德镇市| 分宜县| 喀喇| 于都县| 观塘区| 新宁县| 德惠市| 江口县| 广平县| 巨野县|