MySQL 資料庫的時間溢位問題

WILSON PENG | 彭武興
彭 武 興
Published in
2 min readJan 31, 2018

--

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 吧

--

--