2022-10-19|閱讀時間 ‧ 約 3 分鐘

MySQL 資料庫的時間溢位問題

    UNIX 在設計時,用 32 位元為基礎設計,Timestamp (time_t 結構) 順理成章也是 32 位元 (signed int32),從 1970 年開始算,導致它能記錄的時間在 2038 年會溢位變負數。
    二進位的 00000000 00000000 00000000 00000001 為 1970/01/01 00:00:00
    二進位的 01111111 11111111 11111111 11111111 為 2038/01/19 03:14:07
    而在 64bits 的 Linux 中,MySQL 用 timestamp 型態仍然會有這個問題。所以在開發網站,若變成很熱門的網站後,到了 2038 年,跟時間有關的部份就會科科。
    timestamp 型態 query 測試驗證:
    create table tstest (ts timestamp); 
    insert into tstest values ('1895–10–22'); # 日本統治台灣
    insert into tstest values ('2047–08–17'); # 貓王的歌曲變公開版權
    結果 select * from tstest 時,只會看到二筆 0000–00–00 00:00:00
    目前解決方法是用 datetime 型態
    create table dttest (dt datetime); 
    insert into dttest values ('1895–10–22'); # 日本統治台灣
    insert into dttest values ('2047–08–17'); # 貓王的歌曲變公開版權
    之後 select * from dttest 時, 會看到剛才二筆資料都正確顯示
    MySQL 日後 timestamp 會不會變成 64bits? 問甲骨文的 Lawrence Ellison

    本文稍早發佈於 Medium
    分享至
    成為作者繼續創作的動力吧!
    從 Google News 追蹤更多 vocus 的最新精選內容從 Google News 追蹤更多 vocus 的最新精選內容

    發表回應

    成為會員 後即可發表留言