MySQL 严格SQL模式

xiaoxiao2021-02-28  25

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

转载请注明原文地址: https://www.6miu.com/read-59733.html

最新回复(0)