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

news2024/9/20 0:40:58

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

  • 问题背景
  • sql_mode
  • 上机演示
    • 5.7
    • 8.4

问题背景

在项目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()               |
+-------------------------+
| 5.7.42-0ubuntu0.18.04.1 |
+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                                                |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| 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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


mysql> create database te
    -> ;
Query OK, 1 row affected (0.00 sec)

mysql> use te;
Database changed

mysql>  CREATE TABLE stu (
    ->   id INT,
    ->   upTime TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新时间',
    ->   st CHAR(2) NOT NULL DEFAULT '0' COMMENT '状态'
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='学生表';
ERROR 1067 (42000): Unknown error 1067

果然出错了,于是我们修改一下,sql_mode ,在试一遍

mysql> SET  sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql>  CREATE TABLE stu (
    ->   id INT,
    ->   upTime TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新时间',
    ->   st CHAR(2) NOT NULL DEFAULT '0' COMMENT '状态'
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='学生表';
Query OK, 0 rows affected (0.34 sec)

mysql> insert into stu(id,upTime,st) values (1,null,null);
ERROR 1048 (23000): Unknown error 1048
mysql> insert into stu(id,upTime,st) values (1,null,'1');
Query OK, 1 row affected (0.06 sec)

mysql> insert into stu(id,upTime,st) values (2,null,null);
ERROR 1048 (23000): Unknown error 1048
mysql> select * from stu;
+------+---------------------+----+
| id   | upTime              | st |
+------+---------------------+----+
|    1 | 2024-09-02 09:37:07 | 1  |
+------+---------------------+----+
1 row in set (0.00 sec)

我们可以看到插入成功了,而且,upTime 的值 竟然是当前时间!而且,当我同时令st也为null 时,插入报错了!于我最初设想的结果有些出入,看来是只有 TIMESTAMP 这个类型,mysql5.7 做了特殊的处理,其他类型设置为非空时,即使有默认值也不能直接插入null。

8.4

然而,mysql8.4 的版本中,即使你重新修改了 sql_mode的值,允许0日期。但是也不能直接插入null给一个表结构为非空的日期字段。感兴趣的同学可以试一试。这边没什么好贴图的,直接就报了xx can not be null

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2097039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自用Office 365家庭版全家桶 + OneDrive 1TB拼车,40/年,来长期拼的!

自用Office 365家庭版全家桶 OneDrive 1TB拼车,40/年,来长期拼的! 🔍1.背景描述🔍🐡2. 常见问题解答🐡【问】是正版吗?【问】跟普通版本有什么区别?【问】会不会是假货? &#x1f…

1、Java简介+DOS命令+java的编译运行(字节码/机器码、JRE/JVM/JDK/JIT的区别)+一个简单的Java程序

前言:本文属于黑马程序员和javaguide的混合笔记,仅作学习分享使用,建议感兴趣的小伙伴去看黑马原视频或javaguide原文。如有侵权,请联系删除。 Java类型: JavaSE 标准版:以前称为J2SE,主要用来…

掌握一招:‌输入什么命令,‌轻松查看电脑IP地址?‌

在日常使用电脑的过程中,‌无论是进行网络设置、‌远程连接还是解决网络问题,‌了解并查看自己的电脑IP地址都是一项基础且重要的操作。‌对于许多用户来说,‌可能并不清楚如何快速准确地获取这一信息。‌本文将为你揭秘一个简单实用的命令&a…

【数据结构与算法】:十大经典排序算法

文章目录 前言一、冒泡排序(Bubble Sort)1.1 冒泡排序原理1.2 冒泡排序代码1.3 输出结果 二、选择排序(Selection Sort)2.1 选择排序原理2.2 选择排序代码2.3 输出结果 三、插入排序(Insertion Sort)3.1 插…

可重入VI,VI模板和动态VI之间的差异 转

可重入VI 当您想要同时运行同一VI的多个实例时,将使用可重入VI。当VI不可重入时,VI只有一个数据空间。因此,一次只能有一个调用者运行VI,因此调用者可能必须“等待轮到它”时才能使用VI。这是VI的默认选项,但您可以将V…

精通大模型:八本必读书籍,一篇搞定所有知识点!

如果你想深入了解大模型领域,无论是为了学术研究还是实际应用,选择合适的书籍是非常重要的。以下是精选的八本大模型相关书籍,涵盖了从基础理论到高级实践的内容,可以帮助你构建全面的知识体系。 《大模型应用开发极简入门》 简介…

Hadoop之HDFS的原理和常用命令及API(java)

1、简介 书接上回,上篇博文中介绍如何安装Hadoop和基本配置,本文介绍Hadoop中分布式文件组件--HDFS,在HDFS中,有namenode、datanode、secondnamenode这三个角色,本文将详细介绍这几个组件是如何进行协作的,…

PHP一键预约便捷高效咨询小程序系统源码

一键预约,开启便捷高效咨询新时代 —— 你的专属咨询小程序 🚀 【开篇:告别繁琐,拥抱便捷新体验】 在这个快节奏的时代,时间就是金钱,效率就是生命。你还在为寻找咨询服务而四处奔波,或是为了预…

社区团购小程序系统源码+界面diy+分销+团长+供应商+拼团+菜谱+秒杀+预售+配送,开启社区营销新模式

社区团购小程序类似美团优选,兴盛优选平台.是一款针对小区居民开发的在线购物平台,旨在为用户提供便捷、实惠的购物体验;同时还提供了“限时抢购”和“优惠券营销”等多种实惠的购物体验,是小区居民们的不二之选。 一、 特点与优势 社区化运…

SprinBoot+Vue健康管管理微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平…

k8s - Volume 简介和HostPath的使用

K8S 的持久化 K8S 实现持久化存储的方法有很多种 例如 卷 (Volume), 持久卷(PV), 临时卷(EV) 等, 还有很多不常用的选项上图没有列出来 其中Volume 本身也分很多种 包括 Secret, configMap(之前的文章covered了), hostPath, emptyDir等 本文主要focus…

[工具使用]ellisys

工具打开: 1.连接ellisys电源,ellisys Computer接口USB连接电脑,Logic接口与板子出信号的GPIO口连接 工具配置 1.点击"Configure" 2.在打开的Recording options中选择Wireless选项卡 2.选择Wired选项卡​ i.勾选Logic transit…

十五、多线程(基础)

文章目录 一、线程介绍1.1 程序1.2 进程1.3 线程 二、线程使用2.1 创建线程的两种方式2.2 继承Thread类创建线程2.3 实现Runnable接口创建线程2.4 多线程执行2.5 继承Thread vs 实现 Runnable的区别2.6 线程终止 三、线程方法3.1 常用方法3.2 用户线程和守护线程 四、线程生命周…

MindSearch CPU-only 版部署

准备 创建环境 申请获取硅基流动 API Key 测试 hugging face 上传 /workspaces/codespaces-blank git clone https://huggingface.co/spaces/<你的名字>/<仓库名称>把token挂到仓库上&#xff0c;让自己有写权限 务必先初始化 git init git remote add space h…

打架监测识别摄像机

打架监测识别摄像机 是一种基于人工智能和图像识别技术的智能监控设备&#xff0c;旨在实时监测环境中的暴力冲突和打架行为。这种摄像机通常被广泛应用于监狱、学校、公共交通和其他管理需要的场所&#xff0c;以预防和控制不良事件的发生。 打架监测识别摄像机能够自动识别出…

try里面放return,finally还会执行吗?

引言 喜欢请点赞&#xff0c;支持点在看。 关注牛马圈&#xff0c;干货不间断。 趣聊 今天&#xff0c;在与同事讨论编程语言特性时&#xff0c;我们谈到了一个有趣的话题&#xff1a;在JavaScript中&#xff0c;finally块中的return语句是否会覆盖try块中的return。我首先通过…

【STM32项目设计】STM32F411健康助手--硬件SPI (硬件NSS/CS)驱动st7735--1.8寸TFT显示屏(1)

#include "lcd_driver.h"static uint16_t SPI_TIMEOUT_UserCallback(uint8_t errorCode);//液晶IO初始化配置 void LCD_Driver_Init(void) {SPI_InitTypeDef SPI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;/* 使能 LCD_SPI 及GPIO 时钟 *//*!< SPI_LCD…

程序员学CFA——财务报告与分析(七)

财务报告与分析&#xff08;七&#xff09; 存货存货的初始确认简介初始确认存货的初始入账成本费用化支出 发出存货的计量发出存货的计价方法个别计价法先进先出法后进先出法加权平均法总结对比 存货盘点方法实地盘存法永续盘存法总结归纳 后进先出法的特殊问题后进先出储备后…

安全测试|AWVS渗透测试神器工具详解,零基础入门到精通,收藏这一篇就够了

前言 Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的自动化网络漏洞扫描工具&#xff0c;它通过网络爬虫测试你的网站安全&#xff0c;检测流行安全漏洞。它可以扫描任何可通过Web浏览器访问的和遵循HTTP/HTTPS规则的Web站点和Web应用程序。适用于任何中小型和大型…

终于有人将多模态重点内容做成了动画

CLIP是入门多模态的最佳选择&#xff0c;后续多模态模型基本上都延续了它的思想&#xff1a;分别用图像编码器和文本编码器将图像和文本编码到一个共享的特征空间中&#xff0c;然后通过多模态融合方法将配对的图像文本特征向量拉进。 [1] 给定 ↳ 一个包含3个文本-图像对的小…