MySQL 严格SQL模式

SQL mode changes.  Strict SQL mode for transactional storage engines (STRICT_TRANS_TABLES) is now enabled by default.


如果启用了STRICT_ALL_TABLES或STRICT_TRANS_TABLES,严格的SQL模式是有效的,尽管这些模式的效果有所不同:

  • 对于事务表,当启用STRICT_ALL_TABLES或STRICT_TRANS_TABLES时,数据更改语句中的无效或缺失值发生错误。 语句中止并回滚。
  • 对于非事务性表,如果错误值出现在要插入或更新的第一行中,则对于任一模式,行为是相同的:该语句被中止,并且该表保持不变。 如果该语句插入或修改多行,并且错误值发生在第二行或更后一行,则结果取决于启用了哪种严格模式:

For STRICT_ALL_TABLES, MySQL返回一个错误,忽略其余的行。 但是,因为较早的行已被插入或更新,所以结果是部分更新。 为避免这种情况,请使用单行语句,可以在不更改表的情况下中止该语句。

For STRICT_TRANS_TABLES,MySQL将无效值转换为列的最接近的有效值,并插入调整后的值。如果缺少值,MySQL会为列数据类型插入隐式默认值。在这两种情况下,MySQL会生成一个警告而不是错误,并继续处理该语句。


严格模式影响有0的除法,日期为0的,以及日期内有0的:


  • 严格模式影响除0的处理,例如 MOD(N,0):
用于数据更改操作 (INSERT, UPDATE):
如果没有启用严格模式,除以0将插入NULL并且不产生警告。

如果启用严格模式,除以0将产生错误,除非给出了IGNORE。对于INSERT IGNORE和UPDATE IGNORE,除以0将插入NULL并产生警告。


对于SELECT,除以0返回NULL。 启用严格模式也会产生警告。


  • 严格模式影响服务器是否允许“0000-00-00”作为有效日期:
如果未启用严格模式,则允许“0000-00-00”,并且插入不产生警告。

如果启用严格模式,则不允许“0000-00-00”,否则插入会产生错误,除非给出了IGNORE。 对于INSERT IGNORE和UPDATE IGNORE,允许“0000-00-00”,插入会产生警告。


  • 严格模式影响服务器是否允许年份部分不为零,但月份或日期为零的日期(诸如“2010-00-01”或“2010-01-00”之类的日期)):
如果未启用严格模式,则允许零零件的日期并且插入不产生警告。

如果启用严格模式,则不允许使用0的日期,否则插入会产生错误,除非给出了IGNORE。 对于INSERT IGNORE和UPDATE IGNORE,具有0部分的日期插入为“0000-00-00”(IGNORE认为有效)并产生警告。


关于IGNORE,更多信息查看 Comparison of the IGNORE Keyword and Strict SQL Mode


在MySQL 5.7.4之前,在MySQL 5.7.8及更高版本中,严格模式会影响处理零,零日期和零的日期以及ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATE NO_ZERO_IN_DATE模式的处理。从MySQL5.7.4到5.7.7, ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATE, 和 NO_ZERO_IN_DATE明确命名并且其效果包含在严格模式的效果中时,不执行任何操作。


详见 SQL Mode Changes in MySQL 5.7






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值