ANSI 模式下,非法日期可以插人,但是插入值却变为“0000-00-00 00:00:00”并且系统给出了 WARNING;而在 TRADITIONAL 模式下,会直接提示日期非法,拒绝插入。...SQL_MODE 在迁移前的调整 在将 MySQL 数据库迁移到其他数据库之前,可以考虑以下步骤来调整 SQL_MODE,以减少迁移时可能出现的兼容性问题: 禁用严格模式:在迁移前,禁用 MySQL 中的严格模式...在迁移过程中处理 SQL_MODE 相关问题 日期和时间处理:一些数据库系统对日期和时间有更严格的要求。...重点测试的领域包括: 查询结果的准确性:检查涉及 GROUP BY、聚合函数、日期处理等 SQL 查询是否在目标数据库中返回预期结果 数据完整性:确保迁移后的数据没有丢失、截断或被错误转换。...通过禁用严格模式、调整日期和空值处理、确保标识符的一致性,以及进行全面的测试,可以确保迁移后的数据和应用程序在新的数据库环境中稳定运行。 5.
c) NO_ZERO_IN_DATE:禁止在日期中使用零值,例如'0000-00-00',在严格模式下会被视为非法日期。...d) NO_ZERO_DATE:禁止使用零值表示日期的部分,例如'2000-00-00',在严格模式下会被视为非法日期。...简单举例 以下是一些非严格模式下可能出现的案例情况: 1) 非严格的日期和时间插入:在非严格模式下,MySQL允许插入不符合日期和时间格式的值,会自动进行转换或舍入 eg: 不合法的日期值'0000...-00-00'等 2) 非严格的字符串插入:在非严格模式下,MySQL允许插入过长的字符串,会自动截断超过字段长度的部分 (建议已开启此类严格模式) eg: varchar(2) 类型的字段,插入...可以插入150,且插入后的值自动截断为 127 4) 非严格的零值插入:在非严格模式下,MySQL允许插入字符串类型的值到数值类型字段,会将非数值字符串转换为0 (建议已开启此类严格模式) eg:
一 前言 前面一篇文章《案例| +1s导致的故障》介绍了因为开发同学对datetime值+1s的操作导致的问题。我们在复盘的时候讨论设置sql_mode为严格模式可行性。于是有了此文。...比如 2020-00-23 ,2020-00-00 这样的值是否可以成为合法的日期值。该模式的对数据合法性的影响依然和是否设置了 严格模式有关。...在严格模式下,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入'0000-00-00'。在非严格模式,可以接受该日期,但会生成警告。...NO_ZERO_DATE 该模式决定了 '0000-00-00' 是否可以成为合法的日期。它的作用和是否开启 严格模式有关。...-00-00 | +----+------------+ 3 rows in set (0.00 sec) 同时设置严格模式和NO_ZERO_DATE,'0000-00-00' 是一个非法的日期值。
什么是严格模式mysql5.7+的版本中,sql_mode为严格模式。比如必须给字段默认值,更新数据的长度必须符合限制等。...不对日期做全面的检查,仅仅检查月份是否在1~12之间,天数是否在1~31之间;这种模式可能是有用的对web应用来说去获取年,月,日在三个不同的字段并且准确存储用户的输入数值,没有验证数据的合法性。...在默认设置下,插入 0 或 NULL 代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长值,那么该模式就起作用了。...NO_ZERO_DATE :这个模式影响着插入的’0000-00-00’值是否作为合法的数值,这个结果和是否启用严格模式有关。...PAD_CHAR_TO_FULL_LENGTH :虽然char 和 varchar 的存储方式不太相同,但是对两个字符串的比较,都只比较其值,忽略CHAR值存在的右填充,即使将SQL_MODE设置为PAD_CHAR_TO_FULL_LENGTH
NO_ZERO_IN_DATE 在严格模式,不接受月或日部分为0的日期。...如果使用IGNORE选项,我们为类似的日期插入'0000-00-00'。在非严格模式,可以接受该日期,但会生成警告。...NO_ZERO_DATE 在严格模式,不要将 '0000-00-00'做为合法日期。你仍然可以用IGNORE选项插入零日期。...在非严格模式,可以接受该日期,但会生成警告 ERROR_FOR_DIVISION_BY_ZERO 在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告...STRICT_TRANS_TABLES 严格模式,进行数据的严格校验,错误数据不能插入,报error错误。如果不能将给定的值插入到事务表中,则放弃该语句。
该模式的简单描述是当在列中插入不正确的值时“给出错误而不是警告”。注释:一旦发现错误立即放弃INSERT/UPDATE。...如果把sql_mode的值设置成后面的两个值(STRICT_TRANS_TABLES或者TRADITIONAL,也就是我们说的严格模式),那么当在列中插入或更新不正确的值时,mysql将会给出错误,并且放弃...-00-00这种日期的插入,但是会有warnings不启用的话,表示允许0000-00-00这种日期的插入,不会有warnings 如果启动NO_ZERO_DATE模时,还启用了strict模式,则0000...';允许插2015-00-02、2015-03-00 这种非法日期,但是实际上插入的是0000-00-00。...但二者还有些区别: 严格模式控制MySQL如何处理非法或丢失的输入值。有几种原因可以使一个值为非法。例如,数据类型错误,不适合列,或超出范围。
在将不正确的值插入列时,此模式的简单描述是 “ 给出错误而不是警告 ”。这是本节最后列出的特殊组合模式之一。 注意 在INSERT或 UPDATE只要误差注意到中止。...禁用严格模式后,会生成'2004-04-31'转换为 无效日期 '0000-00-00'和警告。启用严格模式后,无效的日期会生成错误。...如果启用此模式,则将零件的日期插入'0000-00-00'并产生警告。 如果启用了此模式和严格模式,则不允许包含零件的日期,插入会产生错误,除非IGNORE给出。...对于尝试创建超出最大密钥长度的密钥的严格模式,会产生错误。严格模式未启用时,会导致警告并将密钥截断为最大密钥长度。 严格模式不会影响是否检查外键约束。foreign_key_checks可以用于那个。...严格SQL模式适用于以下错误,表示输入值无效或缺失的一类错误。如果列的数据类型不正确,或者可能超出范围,则该值无效。
sql_mode是个很容易被忽视的变量,在5.6之前默认为空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境一般将这个值设置为严格模式。...转成默认存储引擎STRICT_TRANS_TABLESINSERT、UPDATE出现少值或无效值该如何处理直接报错Warning 超限类型值被截断 非空约束允许空NO_ZERO_DATE在严格模式...,认为日期'0000-00-00'非法 - - NO_ZERO_IN_DATE - - ERROR_FOR_DIVISION_BY_ZERO 在严格模式,在INSERT或UPDATE过程中,如果被零除...用于事物时,会进行事物的回滚。日期类型中的月和日部分不能包含0,不能有0这样的日期(0000-00-00),数据不能除0,禁止grant自动创建新用户等一些校验。...而有些业务则是相反,允许截断插入,则不需要指定STRICT_TRANS_TABLES模式。
BY从句中 STRICT_TRANS_TABLES: 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制 NO_ZERO_IN_DATE: 在严格模式...如果使用IGNORE选项,我们为类似的日期插入’0000-00-00’。在非严格模式,可以接受该日期,但会生成警告。...NO_ZERO_DATE: 在严格模式,不要将 '0000-00-00’做为合法日期。你仍然可以用IGNORE选项插入零日期。...在非严格模式,可以接受该日期,但会生成警告 ERROR_FOR_DIVISION_BY_ZERO: 在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(...1、ANSI模式:宽松模式,更改语法和行为,使其更符合标准SQL。对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。
NO_ZERO_IN_DATE:这个模式影响着日期中的月份和天数是否可以为 0(注意年份是非 0 的),这个模式也取决于严格模式是否被启用。...如果这个模式未启用,那么日期中的零部分被允许并且插入没有警告。如果这个模式启用,那么日期中的零部分插入被作为 0000-00-00 并且产生一个警告。...ERROR_FOR_DIVISION_BY_ZERO:如果这个模式未启用,那么零除操作将会插入空值并且不会产生警告;如果这个模式启用,零除操作插入空值并产生警告;如果这个模式和严格模式都启用,零除从操作将会产生一个错误...RAND() :返回 0 到 1 的随机值 日期和时间函数 日期和时间函数也是 MySQL 中非常重要的一部分,下面我们就来一起认识一下这些函数 下面结合示例来讲解一下每个函数的使用 NOW()...(date) : 返回 UNIX 的时间戳 FROM_UNIXTIME(date) : 返回 UNIXTIME 时间戳的日期值,和 UNIX_TIMESTAMP 相反 DATE_FORMAT(date,
sql_mode 根据官网的解释,MySQL 服务器是可以在不同的 SQL 模式中运行的,这个模式会影响 MySQL 支持的 SQL 语法及其执行的数据验证检查。...SQL模式,如果可能,也为非事务性存储引擎启用严格的SQL模式。...这里提到了一个严格模式的概念,严格模式控制 MySQL 如何处理 INSERT 或 UPDATE 等更改语句中的无效或缺失值,比如上面我们说过的日期和除零问题,如果没有 STRICT_TRANS_TABLES...在转移或升级到 MySQL8 之后,其实最常见的问题就是上面说过的日期问题,0格式日期这种形式其实是已经过时的方式了,也是不推荐的方式,所以在 MySQL8 中会默认在严格模式下禁用这种形式的日期存储,...这一点也是大家需要注意的,能使用正常日期或者使用 null 最好,另外数字时间戳存 0 也是可以表示这类空日期格式的,具体需求还是看你的业务情况来具体分析哦。
前言: 前面文章我们介绍过日期和时间字段的查询方法,最近遇到日期值为零的问题。原来了解过和 sql_mode 参数设置有关,但还不是特别清楚,本篇文章将探究下MySQL怎么处理日期值为零的问题。...1.问题描述 这里我们说的日期为零值是指年、月、日为零,即'0000-00-00'。...显然,这是不合法的日期值,但由于设计问题或历史遗留问题,有时候数据库中有类似日期值为零的数据,默认情况下插入零值日期会报错,可以通过修改参数sql_mode模式来避免该问题。...下面我们给出这两个变量的作用并做下具体测试。 NO_ZERO_DATE模式影响服务端是否允许将 '0000-00-00' 作为有效日期。其效果还取决于sql_mode是否启用了严格模式。...如果启用了此模式和严格模式,则除非IGNORE同时指定,否则不允许插入为零的日期。对于INSERT IGNORE和 UPDATE IGNORE,将该零值日期插入为'0000-00-00'并产生警告。
大家好,又见面了,我是你们的朋友全栈君。 一般建表时候,创建时间用datetime,更新时间用timestamp。这是非常重要的。...如图中我的操作,即使我没有设置request_time属性为ON UPDATE CURRENT_TIMESTAMP,也会自动更新,你就说坑不坑!!!...其次还有个共性,就是他们的格式“不严格”,很自由,一般你认为对的格式都可以正确插入到数据库中。 这里主要解决带时分秒日期的一些常见问题。...“0000-00-00 00:00:00”(前提是mysql的sql_model是非严格模式),但默认不能为null(如果想为null,则需要:[字段名] timestamp NULL DEFAULT...(其实是可以的 8.0亲测,5.7也可以) 3、DATETIME列可以变相的设定默认值,比如通过触发器、或者在插入数据时候,将DATETIME字段值设置为now(),这样可以做到了,尤其是后者,在程序开发中常常用到
如果SQL模式允许此转换,则将无效的日期、日期时间或时间戳值转换为相应类型的“零”值(’0000-00-00’或’0000-00-00 00:00:00’)。...精确的行为取决于是否启用了严格SQL模式和NO_ZERO_DATE模式; 在MySQL 8.0.22和更高版本,可以转换 TIMESTAMP值UTC DATETIME使用提取它们的值 CAST()与AT...* 服务器要求月份和日期值有效,而不仅仅是分别在1到12和1到31范围内。禁用严格模式后,无效日期(例如) ‘2004-04-31’将转换为 ‘0000-00-00’并生成警告。...* MySQL不接受TIMESTAMP值在day或month列中包含零的值或不是有效日期的值。唯一的例外是特殊的“零”值 ‘0000-00-00 00:00:00’,如果SQL模式允许该值。...精确的行为取决于是否启用了严格SQL模式和NO_ZERO_DATE无零日期SQL模式; * 包含两位数年份值的日期是不明确的,因为世纪是未知的。
,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制 NO_ZERO_IN_DATE: 在严格模式,不接受月或日部分为0的日期。...如果使用IGNORE选项,我们为类似的日期插入'0000-00-00'。在非严格模式,可以接受该日期,但会生成警告。...NO_ZERO_DATE: 在严格模式,不要将 '0000-00-00'做为合法日期。你仍然可以用IGNORE选项插入零日期。...在非严格模式,可以接受该日期,但会生成警告 ERROR_FOR_DIVISION_BY_ZERO: 在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告...对于本文开头中提到的错误,可以先把sql_mode设置为ANSI模式,这样便可以插入数据,而对于除数为0的结果的字段值,数据库将会用NULL值代替。
默认的SQL mode ONLY_FULL_GROUP_BY 设置了这个值,如果使用GROUP BY,在SELECT后面出现的字段,在GROUP BY后面必须出现,不然报错如下 Expression #3...,只需要将其去掉就行 STRICT_TRANS_TABLES 严格模式控制MySQL如何处理数据更改语句中的无效或缺失值,如INSERT或UPDATE。...(该模式影响日期,如“2010-00-01”或“2010-01-00”,但不影响“0000-00-00”。要控制服务器是否允许'0000-00-00',请使用NO_ZERO_DATE模式。)...如下SQL的日期月和日为0,启用了严格模式STRICT_TRANS_TABLES和NO_ZERO_IN_DATE,那么就会报错。 INSERT INTO `blue`....NO_ZERO_DATE 上面的NO_ZERO_IN_DATE可以插入'0000-00-00',如果使用了严格模式STRICT_TRANS_TABLES和NO_ZERO_DATE,那么就不可以插入'0000
在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。...STRICT_TRANS_TABLES: 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制 NO_ZERO_IN_DATE: 在严格模式下,不允许日期和月份为零 NO_ZERO_DATE...如果设置的是宽松模式,那么我们在插入数据的时候,即便是给了一个错误的数据,也可能会被接受,并且不报错,例如:我在创建一个表时,该表中有一个字段为name,给name设置的字段类型时char(10),如果我在插入数据的时候...改为严格模式后可能会存在的问题: 若设置模式中包含了NO_ZERO_DATE,那么MySQL数据库不允许插入零日期,插入零日期会抛出错误而不是警告。...例如表中含字段TIMESTAMP列(如果未声明为NULL或显示DEFAULT子句)将自动分配DEFAULT '0000-00-00 00:00:00'(零时间戳),也或者是本测试的表day列默认允许插入零日期
不对日期做全面的检查,仅仅检查月份是否在1~12之间,天数是否在1~31之间;这种模式可能是有用的对web应用来说去获取年,月,日在三个不同的字段并且准确存储用户的输入数值,没有验证数据的合法性。...(最后这一句我确定没有翻译错,但是测试的时候,数据时原样插入的,没有转换为0000-00-00) ANSI_QUOTES :这个模式反人类,大致意思就是启用来这个模式,不能使用双引号来引用字符创,...NO_ZERO_DATE :这个模式影响着插入的’0000-00-00’值是否作为合法的数值,这个结果和是否启用严格模式有关。...NO_ZERO_DATE不是严格模式的一部分,应该和严格模式一起被使用。因为NO_ZERO_DATE将会被放弃在将来的mysql中,它的影响将会被包含进严格模式中。...NO_ZERO_IN_DATE :这个模式影响着日期中的月份和天数是否可以为0(注意年份是非0的),这个模式也取决于严格模式是否被启用。如果这个模式未启用,date中的零部分被允许并且插入没有警告。
字段名 TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00' , ... ) 报错原因 MySQL的sql_mode参数会影响对日期时间的处理方式。...如果NO_ZERO_DATE或者STRICT_TRANS_TABLES模式被启用,那么默认值'0000-00-00 00:00:00'将被认为是无效的。...因此,在这些模式下,将默认值设为'0000-00-00 00:00:00'会导致错误。 解决方式 ① 调整默认值 将建表语句改为如下所示,表示默认值为当前时间戳。...字段名 TIMESTAMP NULL DEFAULT NULL, ... ) ② 调整sql_mode参数 修改sql_mode参数值为ALLOW_INVALID_DATES,表示不对无效的日期进行严格的检查...,从而接受一些看似无效的日期值。
(6)ERROR_FOR_DIVISION_BY_ZERO:该选项决定被零整除的返回值;如果不启用,那么被零整除的返回值为null且不告警;如果启用但在非严格模式下,那么被零整除的返回值为null且产生告警...;如果启用且在严格模式下,那么被零整除会直接报错。...(18)NO_ZERO_DATE:该选项决定‘0000-00-00’是否可以插入;如果不启用,那么‘0000-00-00’可以插入且不告警;如果启用但在非严格模式下,那么‘0000-00-00’可以插入但会产生告警...;如果启用且在非严格模式下,那么‘0000-00-00’不能插入会直接报错。...(19)NO_ZERO_IN_DATE:该选项决定月份和日期是否可以为00;如果不启用,那么月份和日期可以为00且不告警;如果启用但在非严格模式下,那么月份和日期可以为00但会产生告警;如果启用且在非严格模式下
领取专属 10元无门槛券
手把手带您无忧上云