Mysql存储时间
参考:
警告!别再使用TIMESTAMP作为日期字段-51CTO.COM
MySQL :: MySQL 8.0 Reference Manual
基本区别
- 范围区别
- The
DATEtype is used for values with a date part but no time part. MySQL retrieves and displaysDATEvalues in'_`YYYY-MM-DD`_'format. The supported range is'1000-01-01'to'9999-12-31'. - The
DATETIMEtype is used for values that contain both date and time parts. MySQL retrieves and displaysDATETIMEvalues in'_`YYYY-MM-DD hh:mm:ss`_'format. The supported range is'1000-01-01 00:00:00'to'9999-12-31 23:59:59'. - The
TIMESTAMPdata type is used for values that contain both date and time parts.TIMESTAMPhas a range of'1970-01-01 00:00:01'UTC to'2038-01-19 03:14:07'UTC.
- DateTime && Timestamp支持
6位毫秒显示:datetime(6) // timestamp(6)
- the range for
DATETIMEvalues is'1000-01-01 00:00:00.000000'to'9999-12-31 23:59:59.999999' - range for
TIMESTAMPvalues is'1970-01-01 00:00:01.000000'to'2038-01-19 03:14:07.999999'.
- TimeStamp带有时区,DateTime没有
- TimeStamp带有毫秒时,类型 TIMESTAMP 占用 7 个字节,而 DATETIME 无论是否存储毫秒信息,都占用 8 个字节。
- 毫秒支持:从 MySQL 5.6 版本开始DateTime(N) && Timestamp(N)均支持最大6位毫秒
mysql默认时间为,当前时区转化为UTC时间进行存储,因此当时间不对时候应检查自己的Mysql时区设置,未设置Mysql时区,默认使用系统时区!
MySQL :: MySQL 8.0 Reference Manual :: 5.1.15 MySQL Server Time Zone Support 时区设置
设置时间自动更新
插入设置,更新更新:其中小数部分必须设置一致
正确:
CREATE TABLE t1 ( |
错误:
CREATE TABLE t1 ( |
建议:
- TimeStamp性能不如 DATETIME:DATETIME 不存在时区转化问题。
- 性能抖动:海量并发时,存在性能抖动问题。
日期字段推荐使用 DATETIME,没有时区转化。即便使用 TIMESTAMP,也需要在数据库中显式地配置时区,而不是用系统时区。
- DATETIME 占用 8 个字节,TIMESTAMP 占用 4 个字节,DATETIME(6) 依然占用 8 个字节,TIMESTAMP(6) 占用 7 个字节;
- TIMESTAMP 日期存储的上限为 2038-01-19 03:14:07,业务用 TIMESTAMP 存在风险;
- 使用 TIMESTAMP 必须显式地设置时区,不要使用默认系统时区,否则存在性能问题,推荐在配置文件中设置参数 time_zone = ‘+08:00’;
- 推荐日期类型使用 DATETIME,而不是 TIMESTAMP 和 INT 类型;
- 表结构设计时,每个核心业务表,推荐设计一个 last_modify_date 的字段,用以记录每条记录的最后修改时间。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Bai's Blog!
