Mysql存储时间
参考:
警告!别再使用TIMESTAMP作为日期字段-51CTO.COM
MySQL :: MySQL 8.0 Reference Manual
基本区别
- 范围区别
- The
DATE
type is used for values with a date part but no time part. MySQL retrieves and displaysDATE
values in'_`YYYY-MM-DD`_'
format. The supported range is'1000-01-01'
to'9999-12-31'
. - The
DATETIME
type is used for values that contain both date and time parts. MySQL retrieves and displaysDATETIME
values 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
TIMESTAMP
data type is used for values that contain both date and time parts.TIMESTAMP
has 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
DATETIME
values is'1000-01-01 00:00:00.000000'
to'9999-12-31 23:59:59.999999'
- range for
TIMESTAMP
values 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!