点击上方"蓝字"

关注我们,享更多干货!

时间真的存在吗?有观点认为,时间只是人类构想出来的一种概念,是用来衡量事物变化的标准。对于数据库来说,时间伴随着数据并进。让我们进入MySQL时间漩涡中看一看。

1. 时间类型的字段

MySQL时间类型字段:

下面是容易忽略的内容:

  • TIMESTAMP保存数据方式:
    MySQL将TIMESTAMP值从当前时区转换为UTC进行存储,并从UTC返回到当前时区进行检索。(这不适用于其他类型,比如DATETIME。)默认情况下,每个连接的当前时区是服务器的时间。时区可以在每个连接的基础上设置。只要时区设置保持不变,就会返回所存储的相同值。如果存储一个时间戳值,然后更改时区并检索该值,则检索到的值与存储的值不同。出现这种情况是因为没有在两个方向上使用相同的时区进行转换。当前时区可以作为time_zone系统变量的值。

  • TIMESTAMP和SQL_MODE组合
    sql_mode也会影响timestamp值:

mysql> CREATE TABLE ts (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,col TIMESTAMP NOT NULL) AUTO_INCREMENT = 1;mysql> SHOW VARIABLES LIKE  '%sql_mode%';+---------------+---------------------+
| Variable_name | Value               |
+---------------+---------------------+
| sql_mode      | STRICT_TRANS_TABLES |
+---------------+---------------------+
mysql>  INSERT INTO ts (col) VALUES ('1969-01-01 01:01:10');
ERROR 1292 (22007): Incorrect datetime value: '1969-01-01 01:01:10' for column 'col' at row 1mysql> SET sql_mode="";
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW VARIABLES LIKE  '%sql_mode%';+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_mode      |       |
+---------------+-------+
mysql>  INSERT INTO ts (col) VALUES ('1969-01-01 01:01:10'),('2999-01-01 01:01:10');
Query OK, 2 rows affected, 2 warnings (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 2
mysql> show warnings;+---------+------+----------------------------------------------+
| Level   | Code | Message                                      |
+---------+------+----------------------------------------------+
| Warning | 1264 | Out of range value for column 'col' at row 1 |
| Warning | 1264 | Out of range value for column 'col' at row 2 |+---------+------+----------------------------------------------+
mysql> SELECT * FROM TS;
+----+---------------------+
| id | col                 |
+----+---------------------+
|  1 | 0000-00-00 00:00:00 |
|  2 | 0000-00-00 00:00:00 |+----+---------------------+
2 rows in set (0.00 sec)

通过控制sql_mode,超出timestamp限制值还是插入进去了,但采用的是0填空方式。

对于STRICT_TRANS_TABLES, MySQL将一个无效的值转换为最接近的有效值,然后插入调整后的值。如果缺少一个值,MySQL将为列数据类型插入隐式的默认值。

2. explicit_defaults_for_timestamp时间处理机制

默认情况是启用。

在MySQL 8.0.22中,如果试图在声明为TIMESTAMP NOT NULL的列中插入NULL,将会被拒绝,并产生错误。

1)explicit_defaults_for_timestamp被禁用时:

  • 没有使用NULL属性显式声明的时间戳列将自动使用NOT NULL属性声明。允许为这样的列赋值为NULL,并将该列设置为当前时间戳。在MySQL 8.0.22中,如果试图在声明为TIMESTAMP NOT NULL的列中插入NULL,将会被拒绝,并产生错误。

  • 如果表中的第一列没有使用NULL属性或显式的DEFAULT或ON UPDATE属性进行声明,则会自动使用默认的CURRENT_TIMESTAMP属性和ON UPDATE CURRENT_TIMESTAMP属性进行声明。

  • TIMESTAMP 如果没有显式地使用NULL属性或显式默认属性声明,则自动声明为默认的’0000-00-00 00:00:00’(“零”时间戳)。

  • 根据启用的是strict SQL模式还是NO_ZERO_DATE SQL模式,默认值“0000-00-00 00:00:00”可能无效。

2)explicit_defaults_for_timestamp被启用:

  • 不可能为TIMESTAMP指定NULL值来将其设置为当前时间戳。要指定当前时间戳,设置为CURRENT_TIMESTAMP或一个同义词,比如NOW()。

  • 没有使用not NULL属性显式声明的TIMESTAMP列将自动使用NULL属性声明并允许空值。

  • 使用NOT NULL属性声明的时间戳列不允许空值。对于为这样的列指定NULL的插入,如果启用了strict SQL模式,那么单行插入会出现错误,或者禁用了strict SQL模式的多行插入会插入’0000-00-00 00:00:00’。在任何情况下,为列赋值为NULL都不会将其设置为当前时间戳。

  • 使用NOT NULL属性显式声明且没有显式默认属性的时间戳列被视为没有默认值。对于未为此类列指定显式值的插入行,结果取决于SQL模式。如果启用了严格SQL模式,则会出现错误。如果没有启用严格的SQL模式,则使用默认隐式值’0000-00-00 00:00:00’声明该列,并出现警告。

  • timestamp类型字段 不会自动使用默认的CURRENT_TIMESTAMP属性或更新CURRENT_TIMESTAMP属性声明。这些属性必须显式指定。

测试:

CREATE TABLE `test1`(
id bigint not null AUTO_INCREMENT COMMENT '主键ID',
name varchar(20) COMMENT '主键ID',
create_time TIMESTAMP  NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'cr time',
PRIMARY KEY(id))ENGINE=InnoDB  AUTO_INCREMENT=1 ;
SHOW VARIABLES LIKE 'explicit_defaults_for_timestamp';
SET  GLOBAL  explicit_defaults_for_timestamp=ON;
SET  GLOBAL  explicit_defaults_for_timestamp=OFF;
INSERT INTO test1(id,name,create_time) VALUES(1,'Kit',NULL);

3. MySQL系统配置

系统相关事件参数包含3个:

mysql>show global variables where Variable_name like '%time_zone%' or Variable_name like 'log_timestamp%';+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | SYSTEM |
| log_timestamps   | UTC    |+------------------+--------+
3 rows in set (0.00 sec)

1)system time zone:

当服务器启动时,它尝试自动确定主机的时区,并使用它来设置system_time_zone系统变量。此后该值不会改变。

2)time_zone:

全time_zone表示服务器当前运行的时区。初始的time_zone值为“SYSTEM”,表示服务器时区与系统时区一致。

  • 如果设置为SYSTEM,如MySQL函数调用都会调用一个系统库来确定当前的系统时区。这个调用可能被一个全局互斥锁保护,从而导致争用。CPU使用率高问题。

  • 设置会话时区会影响时区敏感的时间值的显示和存储。这包括NOW()或CURTIME()等函数显示的值,以及存储在时间戳列中的值和从时间戳列检索到的值。时间戳列的值将从会话时区转换为UTC用于存储,从UTC转换为会话时区用于检索。

  • 会话时区设置不影响UTC_TIMESTAMP()等函数显示的值,也不影响DATE、time或DATETIME列中的值。这些数据类型的值也不存储在UTC;时区仅在从时间戳值转换时适用它们。

备注:MySQL还提供时区导入到MySQL系统库的方法。通过mysql_tzinfo_to_sql程序加载/usr/share/zoneinfom下的时区信息。

mysql> SELECT COUNT(*) FROM mysql.time_zone_name;+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+

##mysql_tzinfo_to_sql工具导入时区值。

shell>mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
mysql> SELECT COUNT(*) FROM mysql.time_zone_name;+----------+
| COUNT(*) |
+----------+
|     1780 |
+----------+

3)log_timestamps

  • 这个变量控制写入错误日志的消息以及写入文件的一般查询日志和慢速查询日志消息中的时间戳的时区。

  • 它不会影响一般查询日志的时区和慢速查询日志消息写入表(mysql。general_log mysql.slow_log)。

  • 允许的log_timestamps值是UTC(默认值)和SYSTEM(本地系统时区)。

备注:UTC一般指协调世界时。协调世界时,又称世界统一时间、世界标准时间、国际协调时间,就是UTC+8小时=中国时间。当然值需要跟系统记录时间一致,才能更好地管理。

#设置时区,更改为东八区
SET GLOBAL time_zone = '+8:00';

建议:
MySQL配置文件my.cnf

[mysqld]
log_timestamps=SYSTEM
default-time_zone                  = '+8:00'
mysql>show global variables where Variable_name like '%time_zone%' or Variable_name like 'log_timestamp%';+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| log_timestamps   | SYSTEM |
| system_time_zone | CST    |
| time_zone        | +08:00 |
+------------------+--------+

总结

从时间类型、参数、系统时区了解到,MySQL里时间应该怎样设置和使用,特别是无特殊要求,sql_mode不要轻易改动。

关于作者

崔虎龙,云和恩墨MySQL技术顾问,长期服务于金融、游戏、物流等行业的数据中心,设计数据存储架构,并熟悉数据中心运营管理的流程及规范,自动化运维等。擅长MySQL、Redis、MongoDB数据库高可用设计和运维故障处理、备份恢复、升级迁移、性能优化。自学通过了MySQL OCP 5.6和MySQL OCP 5.7认证。2年多开发经验,10年数据库运维工作经验,其中专职做MySQL工作8年;曾经担任过项目经理、数据库经理、数据仓库架构师、MySQL技术专家、DBA等职务;涉及行业:金融(银行、理财)、物流、游戏、医疗、重工业等。

墨天轮原文链接:https://www.modb.pro/db/53474(复制到浏览器或者点击“阅读原文”立即查看)

END

推荐阅读:267页!2020年度数据库技术年刊

推荐下载:2020数据技术嘉年华PPT下载

2020数据技术嘉年华近50个PPT下载、视频回放已上传墨天轮平台,可在“数据和云”公众号回复关键词“2020DTC”获得!

由ACDU(中国DBA联盟)和墨天轮联合出品的全新视频节目「数据三分钟」已发布多期,快速了解数据行业动态,快关注我们的视频号看看吧!↓↓↓

点击下图查看更多 ↓

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

  点个“在看”

你的喜欢会被看到❤

MySQL关于时间设置的注意事项相关推荐

  1. Mysql 超时时间设置

    1.建立数据库连接超时设置. jdbc:mysql://localhost:3306/gjm?connectTimeout=3000 connectTimeout:表示的是数据库驱动(mysql-co ...

  2. 连接mysql超时时间设置多少_怎么设置数据库的连接数和连接超时时间

    如何设置数据库的连接数和连接超时时间 连接数的话可以修改spfile文件来约束 查看当前的连接数: select count(*) from v$process; –数据库允许的最大连接数: sele ...

  3. mysql关于时间的面试题,mysql时间设置默认值MySQL常见面试题

    1.limit(选出10 到20 条) select * from students order by id limit 9,10; 2.MySQL 会使用索引的操作符号 =,>,=,betwe ...

  4. mysql 数据表 时间自动_MySQL数据库时间设置自动添加时间和自动更新时间

    MySQL字段中设置时间字段自动添加创建时间和自动更新时间设置, 设置字段类型为:timestamp 默认值设置为current_timestamp(), 更新时间字段字段类型为:timestamp ...

  5. php工具箱mysql停止进程_PHP进程卡死和MySQL超时时间的设置方法

    前言 最近线上一台服务器的nginx总是会有一部分请求(不是所有请求)报upstream timed out (110: Connection timed out) while connecting ...

  6. 在Redis中设置了过期时间的Key注意事项

    作者:千山qianshan juejin.im/post/5d6bda096fb9a06acc009dc8 熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的 ...

  7. mysql修改时间为东八区,mysql时区设置为东八区

    场景:后台返回给页面的时间统一差8小时. 分析:差八小时,应该是时区问题.具体的是哪一层出的问题呢,mybatis?mysql?系统时间? 解析: 1.查询mysql时区(正常) 输入show var ...

  8. [技术]mysql 慢查询时间设置_Mysql 慢查询设置

    -- 查询是否设置慢查询 show variables like 'slow_query%'; -- 慢查询时间  -- show variables like 'long_query_time'; ...

  9. mysql 慢查询时间设置_Mysql 慢查询设置

    Mysql慢查询设置 分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为"慢查询& ...

最新文章

  1. 飞机的“黑色十分钟”能被人工智能消灭吗?
  2. css变成块级元素_探讨行内元素转换为块级元素_html/css_WEB-ITnose
  3. Centos 下 Nginx 信号控制
  4. 远程ssh shell 脚本 tcgetattr: Inappropriate ioctl for device错误
  5. Lesson 4- Exchange Server 2010 Publish
  6. boost::exchange的测试程序
  7. 关闭Eureka的服务自我保护
  8. Spark RDD使用详解3--Value型Transformation算子
  9. 用一个Sql语句查询出表中的一个字段的数据类型
  10. aspnetcore 应用 接入Keycloak快速上手指南
  11. spring和maven_具有Spring和Maven教程的JAX–WS
  12. Oracle 索引概述
  13. vim 删除多行_Vim 可视化模式入门
  14. fillna填充某一列_DataFrame基础运算以及空值填充的案例分析
  15. android 屏幕坐标系,android 屏幕坐标总结
  16. 小程序毕设作品之微信企业公司小程序毕业设计(6)开题答辩PPT
  17. GBT 39323-2020 乘用车车道保持辅助(LKA)系统性能要求及试验方法
  18. Modelica学习笔记
  19. Java 实现计算器功能
  20. linux之kubuntu挂载硬盘

热门文章

  1. Java 并发(JUC 包-03)
  2. 网络操作 回调函数 http
  3. Bootstrap让内容块居中
  4. Bootstrap3 表单控件的状态
  5. Bootstrap3 带悬停效果的表格样式
  6. 看完这篇,你的老电脑能够快到起飞再也不卡!
  7. 为什么没有看到webcontent_环卫工人工资低工作辛苦,为什么还有那么多人愿意做呢?...
  8. 光驱怎么挂载第二个光驱_电脑光驱经常自己打开自己关闭,怎么回事
  9. java八种包装_Java的八种基本数据类型及其包装类
  10. linux下mysql5.7的安装教程_linux下mysql 5.7.18安装教程 邯郸