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