-- 当尝试插入2039年日期时
INSERT INTO batch_version (product_expiration_date)
VALUES ('2039-03-04 00:00:00');
系统报错:
Data truncation: Incorrect datetime value: '2039-03-04' for column 'product_expiration_date'
特性 | TIMESTAMP | DATETIME |
---|---|---|
时间范围 | 1970-01-01 ~ 2038-01-19 | 1000-01-01 ~ 9999-12-31 ✅ |
存储空间 | 4字节 | 8字节 |
时区处理 | UTC自动转换 | 无时区信息 |
死亡倒计时 | 剩余15年 ⏳ | 永不过期 ∞ |
-- 批量修改高危字段(建议凌晨执行)
ALTER TABLE batch_version
MODIFY product_expiration_date DATETIME NULL,
MODIFY product_production_date DATETIME NULL,
MODIFY batch_listing_date DATETIME NULL,
MODIFY batch_off_listing_date DATETIME NULL;
// 修改前:定时炸弹
@Column(columnDefinition = "TIMESTAMP")
private Date productExpirationDate;
// 修改后:安全模式
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date productExpirationDate; // 自动映射DATETIME
-- 全库扫描TIMESTAMP字段
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE = 'timestamp'
AND TABLE_SCHEMA = 'your_db';
-- 测试插入未来日期(建议准备灭火器)
INSERT INTO batch_version (product_expiration_date)
VALUES ('2039-03-04 00:00:00');
-- 时空穿梭验证
SELECT * FROM batch_version
WHERE product_expiration_date > '2038-01-01';
ALTER TABLE batch_version ENGINE = InnoDB; -- 开启事务保护!
血泪教训:
当你在代码中看到TIMESTAMP
,就像看到2038年的终结者——要么消灭它,要么被它消灭!