- 不要用字符串存储日期
- DateTime和TimeStamp之间的选择
2.1 DateTime没有时区信息
2.2 DateTime类型耗费更大的空间- 数值型时间戳
- 总结
1. 不要用字符串存储日期
字符串存储存在的问题:
- 空间,字符串占用更大的空间
- 效率,字符串存储日期效率较低(逐个字符比对),无法用日期相关的 API 进行计算和比较。
2. DateTime和TimeStamp之间的选择
通常首选Timestamp
2.1 DateTime没有时区信息
DateTime 类型是没有时区信息的(时区无关),DateTime 类型保存的时间都是当前会话所设置的时区对应的时间。所以当时区更换之后,比如服务器更换地址或者更换客户端连接时区设置的话,就会导致从数据库中读出的时间错误。
Timestamp 和时区有关。Timestamp 类型字段的值会随着服务器时区的变化而变化,自动换算成相应的时间,也就是说在不同时区,查询到同一个条记录此字段的值会不一样。
一些关于MySQL时区设置一个常用sql命令
# 查看当前会话时区
SELECT @@session.time_zone;
# 设置当前会话时区
SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
# 数据库全局时区设置
SELECT @@global.time_zone;
# 设置全局时区
SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
2.2 DateTime类型耗费更大的空间
Timestamp 只需要使用 4 个字节的存储空间,但是 DateTime 需要耗费 8 个字节的存储空间。但是,这样同样造成了一个问题,Timestamp 表示的时间范围更小。
- DateTime :1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
- Timestamp: 1970-01-01 00:00:01 ~ 2037-12-31 23:59:59
3. 数值型时间戳
有时也会用 int 或者 bigint 类型的数值也就是时间戳来表示时间。
这种存储方式的具有 Timestamp 类型的所具有一些优点,并且使用它的进行日期排序以及对比等操作的效率会更高,跨系统也很方便,毕竟只是存放的数值。缺点也很明显,就是数据的可读性太差了,你无法直观的看到具体时间。