TIMESTAMP和DATETIM
相同点
两者都可用来表示YYYY-MM-DD HH:MM:SS[.fraction]类型的日期。
不同点
datetime的默认值为null,timestamp的默认值不为null,且为系统当前时间(current_timestatmp)。如果不做特殊处理,且update没有指定该列更新,则默认更新为当前时间。
datetime占用8个字节,timestamp占用4个字节。timestamp利用率更高。
二者存储方式不一样,对于timestamp,它把客户端插入的时间从当前时区转化为世界标准时间(UTC)进行存储,查询时,逆向返回。但对于datetime,基本上存什么是什么。
二者范围不一样。timestamp范围:‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’; datetime范围:’1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’。
时区
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | CST |
| time_zone | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)
system_time_zone(系统默认时区),一般为CST,在不同地区可以解读成不同时间:
美国中部时间 Central Standard Time (USA) UTC-06:00
澳大利亚中部时间 Central Standard Time (Australia) UTC+09:30
中国标准时 China Standard Time UTC+08:00
古巴标准时 Cuba Standard Time UTC-04:00
time_zone为全局时区,默认采用系统时区(CST),由于CST有几种计算方式,有时会导致时间差,可以修改/etc/my.cnf在mysqlid下加入default-time-zone = '+8:00',重启MySQL即可永久生效。