mysql时间戳和datetime对比(MySQL时间设置注意事项的深入总结)
mysql时间戳和datetime对比
MySQL时间设置注意事项的深入总结时间真的存在吗?有观点认为,时间只是人类构想出来的一种概念,是用来衡量事物变化的标准。对于数据库来说时间伴随着数据并进。进入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 1 mysql> 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时间设置注意内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
原文链接:https://www.modb.pro/db/53474
- mysql水平拓展的瓶颈(MySQL令人大跌眼镜的隐式转换)
- mysql的decimal类型(MySQL数据类型DECIMAL用法详解)
- 如何让mysql强制设置复杂的密码
- mysql中基本语句(MySQL中explain语句的基本使用教程)
- docker部署mysql如何访问(完美解决docker安装mysql后Navicat连接不上的问题)
- mysql单独导出表(mysql实现从导出数据的sql文件中只导入指定的一个表)
- MySql DATE_FORMAT日期格式化
- mysql流式查询(MySQL全面瓦解之查询的正则匹配详解)
- mysql服务器端安装步骤(windows下jsp+mysql网站环境配置方法)
- python连接到本地的mysql数据库(Python实现连接MySql数据库及增删改查操作详解)
- MySQL SQL Assistant智能提示
- navicat premium连接mysql报错(Navicat连接MySQL错误描述分析)
- mysql默认的事务隔离级别是哪一种(MySql学习笔记之事务隔离级别详解)
- mysql中timestamp类型的CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP属性
- mysql数据库怎么换行(MySQL数据中很多换行符和回车符的解决方法)
- MySQL定时任务(EVENT事件)如何配置详解(MySQL定时任务EVENT事件如何配置详解)
- 百事大吉蓝底 绿底手机高清壁纸(绿底手机高清壁纸)
- 蓝底证件照怎么制作 证件照换底色 换尺寸快速搞定(蓝底证件照怎么制作)
- 你喜欢足球吗 足球如何点亮世界的(足球如何点亮世界的)
- 不可分鸽是什么梗(不可分鸽是什么梗)
- 古代的鸽子是爱情的象征,并非和平的使者(古代的鸽子是爱情的象征)
- 一课译词 放鸽子(一课译词放鸽子)
热门推荐
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9