时间真的存在吗?有观点认为,时间只是人类构想出来的一种概念,是用来衡量事物变化的标准。对于数据库来说时间伴随着数据并进。进入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

#设置时区,更改为东八区
SET GLOBAL time_zone = '+8:00';   
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 关于时间设置注意事项相关推荐

  1. MySQL关于时间设置的注意事项

    点击上方"蓝字" 关注我们,享更多干货! 时间真的存在吗?有观点认为,时间只是人类构想出来的一种概念,是用来衡量事物变化的标准.对于数据库来说,时间伴随着数据并进.让我们进入MyS ...

  2. Mysql 超时时间设置

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

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

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

  4. LINUX下PHP使用PDO访问MYSQL的连接设置注意事项

    为什么80%的码农都做不了架构师?>>>    在使用XAMPP搭建站点,mysql单独安装,使用PDO连接时出现错误提示"mysql.sock"不存在, 转载于 ...

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. [面试]future模式
  2. c语言小于n的素数和,关于求N以内素数的一点小问题(N小于一亿)
  3. [WPF] VisualBrush 中的布局
  4. 号称最安全的苹果TEE被黑客攻破了,怎么办?
  5. java 64位 默认分配内存大小_查看你机器中Java程序堆内存的默认初始大小和最大大小...
  6. 冻结拆分_冻结首行与尾行?还有能这种操作
  7. canvas3:绘制感叹号
  8. 【转载】.NET设计模式之抽象工厂模式(Abstract Factory)
  9. 【转载】Linux安装nginx
  10. 在Ubuntu 18.04中更改时区
  11. 互联网公司忽悠员工的黑话,套路太深了。。
  12. access实验报告体会_Access2010实验报告
  13. G502使用计算机配置,罗技G502鼠标驱动调试详解!实战《男友4》设置!
  14. 企业销售统计管理页面ui模板
  15. 超越存储 惠普高端全闪存重新定义闪存
  16. 皮卡丘(pikachu)暴力破解
  17. Codeforces - Captain Flint and Treasure
  18. SpringBoot自定义数据源DruidDataSource
  19. git clone 项目时总是提示输入密码
  20. selenium模拟登录163邮箱,定位账号及密码输入框问题和iframe嵌套

热门文章

  1. java模拟器下载_JAVA模拟器(指小游)
  2. 步进电机 高速光耦_光耦的参数以及高速光耦如何选型!-先进光半导体
  3. 抽象与具体,形而上者谓之道,形而下者谓之器
  4. python读txt写入excel_python实现读Excel写入.txt的方法
  5. 计算机程序设计艺术初读感
  6. 电脑重装系统详细教程(以安装win10为例)
  7. qq传离线文件提示服务器超时,QQ传文件时进度条显示不正常的解决办法
  8. 1096 大美数 分数 15
  9. ThreadLocal的介绍与使用
  10. Cadence Allegro修改静态铜皮为动态铜皮图文教程及视频演示