MySQL时间类型Timestamp和Datetime 的深入理解

MySQL数据库常用的时间类型有timestamp和datetime,两者主要区别是占用存储空间长度不一致、可存储的时间也有限制,但针对不同版本下,timestamp字段类型的设置需要慎重,因为不注意的可能会被“坑死”。

一、TIMESTAMP和DATETIME字段类型对比

字段类型   存储长度   时间范围   备注  
timestamp   4字节   '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC      
datetime   8字节(5.7占5字节)   '1000-01-01 00:00:00' to '9999-12-31 23:59:59'      

1.timestamp注意事项

(1)5.7版本之前,没有 参数(5.7默认开启,timestamp不会设置default值属性),timestamp字段默认存在default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP属性,默认值针对的主要是以下函数产生的时间

These are CURRENT_TIMESTAMP(), NOW(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP, and LOCALTIMESTAMP().

(2)mysql的timestamp值自动从当前时区转换到utc时区存储,并且自动从utc时区转换为当前系统时区检索返回

官方参考文档:https://dev.mysql.com/doc/refman/5.7/en/datetime.html MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval.
(This does not occur for other types such as DATETIME.) By default, the current time zone for each connection is the server's time.

2.datetime注意事项:

在mysql5.7之后,datetime字段也可以指定默认值,并且格式和timestamp一样

CREATE TABLE t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); 或 DEFAULT 0 or DEFAULT '2000-01-01 00:00:00'

二、数据库时区参数

1.system_time_zone

  数据库实例启动,从my.cnf配置参数timezone=timezone_name获取,若my.cnf未设置则从操作系统获取环境变量TZ获取
2.time_zone

  数据库当前实际使用的时区,默认为system,即系统时区,其设置可以通过set global time_zone=''设置,其中参数值有以下三种形式:'SYSTEM' 、'+10:00' 、'Europe/Helsinki'

Linux时区知识扩展: Linux将时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟两种。系统时间是指当前Linux Kernel中的时钟,
而硬件时钟则是主板上由电池供电的那个主板硬件时钟,这个时钟可以在BIOS的
"Standard BIOS Feture"项中进行设置。 系统时钟: 所有操作系统命令、函数依赖的时钟,独立于硬件时钟运行,可通过date设置 设置系统时间:date -s "2017-08-22 22:58:00" 查看时区:date -R 硬件时钟: Linux启动从系统配置获取 查看硬件时钟:clock --show 、 hwclock --show 设置硬件时钟:hwclock/clock --set --date="月/日/年 时:分:秒" 系统时钟同步到硬件:/sbin/clock -w 硬件时钟同步到系统:/sbin/clock -s 时区设置: 修改/etc/sysconfig/clock ZONE=Asia/Shanghai rm /etc/localtime 链接到上海时区文件 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 执行完上述过程后,重启机器,即可看到时区已经更改。

、实际使用实例

1.不同版本下timestamp和datetime使用实例

(1)测试timestamp和datetime创建带默认值的表
同时执行创建带默认值的SQL语句,发现5.6(不含5.6)之前版本datetime不支持带DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

CREATE TABLE test (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

5.0
.67版本 ERROR 1067 (42000): Invalid default value for 'dt' 5.5.20版本 ERROR 1067 (42000): Invalid default value for 'dt' 5.6.22版本 Query OK, 0 rows affected (0.02 sec) 5.7.18版本 Query OK, 0 rows affected (0.00 sec)

(2)测试timestamp和datetime创建表结构类型

不指定默认值的情况下创建表结构,发现5.6(不含5.6)timestamp默认值是CURRENT_TIMESTAMP并且随着记录更新而更新

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/45069013b744e1e5e7b92f0827152e76.html