往TIMESTAMP和DATETIME各存同一条数据,切换三次会话时区去读,看谁真实变了、谁真实没变。
代码SET time_zone = '+00:00'; INSERT INTO ts_test VALUES (1, '2026-01-01 12:00:00', '2026-01-01 12:00:00'); SELECT ts, dt FROM ts_test WHERE id=1; SET time_zone = '+08:00'; SELECT ts, dt FROM ts_test WHERE id=1; SET time_zone = '-05:00'; SELECT ts, dt FROM ts_test WHERE id=1;
time_zone='+00:00': ts = 2026-01-01 12:00:00 dt = 2026-01-01 12:00:00 time_zone='+08:00': ts = 2026-01-01 20:00:00 dt = 2026-01-01 12:00:00 ← ts真实变了,dt真实没变 time_zone='-05:00': ts = 2026-01-01 07:00:00 dt = 2026-01-01 12:00:00 ← ts真实又变了,dt真实还是没变
插入的是同一条数据,只是读的时候切换了会话的time_zone——TIMESTAMP列真实内部按UTC存储一个绝对时间点,每次显示的时候,都会真实按当前会话时区做一次实时换算;DATETIME真实只是原样存储了插入时写的那串字符,不关心任何时区概念,读出来永远是那串字面值。
每一步都是本文上面用真实SET time_zone跑出来的原始结果。