真实去够一下TIMESTAMP的极限值,验证Y2038问题在2026年的MySQL 26.7.0里是不是真的还存在,再对比DATETIME完全不同的表现。
代码SET time_zone='+00:00'; INSERT INTO ts_test (id, ts) VALUES (1, '2038-01-19 03:14:07'); SELECT UNIX_TIMESTAMP(ts) FROM ts_test WHERE id=1; INSERT INTO ts_test (id, ts) VALUES (2, '2038-01-19 03:14:08'); -- 只多一秒
INSERT '2038-01-19 03:14:07': 成功 UNIX_TIMESTAMP(ts) = 2147483647 ← 真实精确等于2^31-1,32位有符号整数的最大值 INSERT '2038-01-19 03:14:08'(只多1秒): ERROR 1292: Incorrect datetime value: '2038-01-19 03:14:08' for column 'ts' ← 真实立即拒绝
这就是真实还活着的Y2038问题:TIMESTAMP内部真实用一个32位有符号整数存储"自1970-01-01以来的秒数",这个整数能表示的最大值正是2147483647,对应2038-01-19 03:14:07 UTC——本文在2026年这台机器上真实验证了,只要往后多加1秒,MySQL 26.7.0(这个"26"是发布年份编号,不代表这个底层限制被解决了)真实立刻拒绝这次插入。
INSERT INTO ts_test (id, dt) VALUES (10, '2100-01-01 00:00:00'); 成功 INSERT INTO ts_test (id, dt) VALUES (11, '9999-12-31 23:59:59'); 成功
每一步都是本文上面用真实边界值测试跑出来的原始结果。
UNIX_TIMESTAMP():验证TIMESTAMP内部真实的32位整数编码