Mysql从5.6升级到5.7,或者默认5.7配置时间字段默认当前时间报错

Mysql从5.6升级到5.7,或者默认5.7配置时间字段默认当前时间报错

Elysian
2022-08-12 / 0 评论 / 201 阅读 / 正在检测是否收录...

主要的报错内容,大体上是:mysql Incorrect datetime value 2022-10-10 11:11:11:000Z
这样显示的时间内容,当然0000-00-00 00:00:00这种也有
只要重新设置好sql_mode就可以解决这个问题,解决以上问题只需要设置sql_mode为下列值:
sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

以下是sql_mode具体解释:

一、Sql_mode是什么?

Sql_mode是一组mysql的语法校验规则,定义了mysql应该支持的sql语法、数据校验等。

二、如何查看当前sql_mode配置?

方法一:select @@sql_mode;
方法二:select @@SESSION.sql_mode;
方法三:select @@GLOBAL.sql_mode;

三、如何设置sql_mode?

1、通过命令设置
SET sql_mode = '';
SET SESSION sql_mode = '';
SET GLOBAL sql_mode = '';
2、修改mysql的配置文件my.cnf,修改后需要重启mysql服务使其生效

四、Sql_mode模式

1、ANSI模式
这是一种宽松模式,该模式下,会对所操作数据进行校验,如果不符合校验规则,数据会按照规则执行,并报warning警告。
该模式下,sql_mode参数为:REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI
2、STRICT_TRANS_TABLES模式
这是一种严格模式,该模式下,会对所操作数据进行严格校验,如果不符合校验规则,报error错误。
该模式下,sql_mode参数为:STRICT_TRANS_TABLES
3、TRADITIONAL模式
这是一种严格模式,该模式下,会对所操作数据进行严格校验,如果不符合校验规则,报error错误。用于事务时,会进行事物的回滚,保证了错误数据无法插入到数据库中。
该模式下,sql_mode参数为:STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
注:模式2和3中,在插入不符合校验规则数据时候,都会失败,并报error错误。

五、常用sql_mode各参数详解

1、PIPES_AS_CONCAT
将“||”作为字符串的链接字符操作,而不是作为或运算符,与“concat”相类似。
2、ANSI_QUOTES
不能用双引号来引用字符串,因为它会被解释为识别符。
3、IGNORE_SPACE
用于忽略mysql系统函数与之后的括号之间的空格。
(1)创建一张名为count的表。
(2)用“`”将关键字引住,创建一张名为count的表。
(3)用空间间隔,创建一张名为count的表。
(4)统计函数count()在此时的表现。
(5)设置sql_mode为“IGNORE_SPACE”,可解决count()函数,括号之前的空格。
(6)设置sql_mode为“”后,某些语法失效。
4、STRICT_TRANS_TABLES和STRICT_ALL_TABLES
严格模式的一种,会对所操作数据进行严格校验。如果不符合校验规则,报error错误。
示例可参见四->2、STRICT_TRANS_TABLES模式。
说明:
(1)对于innodb表来说,此两种设置对于单个insert操作,无论插入单行或是多行,只要插入数据与字段类型不兼容,则insert操作失败并回滚;
(2)对于myisam表来说:
A、STRICT_TRANS_TABLES,对于单个insert操作,插入单行数据与字段类型不兼容,则insert操作失败并回滚;插入多行数据,如果插入数据的第一行内容与字段类型不兼容,则insert操作失败并回滚,如果插入数据的第一行内容与字段类型兼容,但后续的数据行存在不兼容的情况,则兼容的数据正常插入,不兼容的数据会转换成符合字段类型的格式再插入,不会中断和回滚;
B、STRICT_ALL_TABLES,如果插入数据的第一行内容与字段类型兼容,但后续的数据行存在不兼容的情况,则兼容的数据正常插入,不兼容的数据则会报错并终止insert操作。
NO_ZERO_IN_DATE
5、在严格模式下,不允许日期和月份为零。
6、NO_ZERO_DATE
在严格模式下,不允许插入0日期。
7、ERROR_FOR_DIVISION_BY_ZERO
在严格模式下,不允许在字段中插入除数为0的运算值,会直接报错。直接计算除数为0的运算,返回null,报warning。
8、ONLY_FULL_GROUP_BY
select后面的字段中,只能出现分组列和聚合列。
9、其他
NO_AUTO_CREATE_USER(用户)
ALLOW_INVALID_DATES(日期)
HIGH_NOT_PRECEDENCE(not优先级)
NO_AUTO_VALUE_ON_ZERO(主键)
NO_BACKSLASH_ESCAPES(反斜杠)
NO_DIR_IN_CREATE(数据目录)
NO_ENGINE_SUBSTITUTION(存储引擎)
NO_UNSIGNED_SUBTRACTION(无符号数相减计算)
PAD_CHAR_TO_FULL_LENGTH(char字段存储)
TIME_TRUNCATE_FRACTIONAL(时间类型超出范围处理)

六、不同版本默认的SQL_MODE

MySQL 5.5:空
MySQL 5.6:NO_ENGINE_SUBSTITUTION
MySQL 5.7:ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
MySQL 8.0:ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION
————————————————
版权声明:本文为CSDN博主「firesea」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/firesea/article/details/118693291

0

评论

博主关闭了所有页面的评论