mysql5.7 TIMESTAMP NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ 换版8版本 引发的问题

mysql5.7 TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' 换版引发的问题

问题背景

在项目mysql版本由5.7 换版到8.4版本后,我们进行回归测试时,却发现一个积年代码报错了,是数据库插入报的错 xxx can not be null,!!!∑(゚Д゚ノ)ノ
这都是多早的老代码了,怎么会报这个错!人直接傻了。查看代码,那个字段确实没有设置任何值,然后查看数据库表结构,发现那个字段定义有点奇怪,upTime TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新时间',默认值是 0000-00-00 00:00:00,而不是常见的CURRENT_TIMESTAMP。但似乎也啥关联,要命的是字段明明是非空,为什么在5.7版本会插入成功!??

sql_mode

sql_mode 是 MySQL 中的一个系统变量,用于控制 MySQL 服务器运行时的 SQL 模式,影响 MySQL 的行为和功能。SQL 模式定义了 MySQL 服务器应该执行 SQL 语句的方式,包括语法检查、数据验证、警告和错误处理等方面。

在 MySQL 中,sql_mode 可以通过多种方式设置,包括在配置文件中指定默认的 sql_mode,在会话级别或全局级别动态修改 sql_mode。以下是一些常见的 sql_mode 设置:

  1. STRICT_TRANS_TABLES:在这种模式下,MySQL 会对插入、更新和删除操作进行严格的数据类型检查,确保数据的完整性。如果数据类型不匹配或值超出范围,将会产生错误。
  2. NO_ZERO_DATE:禁止插入 ‘0000-00-00’ 或 ‘0000-00-00 00:00:00’ 作为日期或日期时间值, 如果发现这样的值,会产生错误。
  3. ONLY_FULL_GROUP_BY:在这种模式下,如果在 GROUP BY 子句中的列没有在 SELECT 列表中出现,将会产生错误,要求所有非聚合列都出现在 GROUP BY 子句中。
  4. ERROR_FOR_DIVISION_BY_ZERO:在除法运算中如果除数为 0,会产生错误,而不是返回 NULL。
  5. ANSI_QUOTES:启用 ANSI_QUOTES 模式后,双引号被视为引用标识符的引号,而不是字符串引号。
  6. NO_ZERO_IN_DATE:设置该值,mysql数据库在严格模式下,不允许日期和月份为零

通过设置合适的 sql_mode,您可以控制 MySQL 的行为,使其符合您的需求和标准。根据项目的要求,可以选择不同的模式来确保数据的正确性和一致性。

那么,我们查看mysql5.7的官方文档,发现,mysql5.7 里面的 默认 sql_mode模式,里面有NO_ZERO_DATENO_ZERO_IN_DATE
在这里插入图片描述
所以,其实在5.7 版本默认配置中,这样的建表语句是非法的。那么我们找一个环境试一试!我用的是一个在线网站,小闪电

上机演示

5.7

mysql> select version();
+-------------------------+
| version()</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值