一、sql的执行模式

默认情况下MySQL会用严格模式运行SQL。可以通过 select @@sql_mode; 查看MySQL使用了哪些sql mode。
image.png

MySQL会根据sql_mode系统变量的值将这些模式不同地应用于不同的客户端。

使用不同的sql mode执行sql,可能会得到不同的响应结果。

二、通过实验测试sql mode

创建一个表:

  1. CREATE TABLE `t1` (
  2. `id` int NOT NULL
  3. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

实验一:在默认的sql mode下执行插入空值和空串的语句,会报错。
image.png

实验二:关闭严格模式后,执行插入空值和空串的语句,会爆出warning+插入默认值。
关闭严格模式:set session sql_mode='NO_ENGINE_SUBSTITUTION';
image.png
image.png

三、需要你了解的几个 sql mode

几个常见或者和日期相关的sql mode。了解就好了,不用刻意记住它,了解就是加分项!
1、STRICT_TRANS_TABLES
将其加入到sql_mode之后,MySQL会判断是否可以直接把用户给的值插入事务表中,如果不能就中止该语句。对于非事务表,如果该值出现在单行语句或多行语句的第一行中,则中止该语句。
结合上面的例子可以更好的理解STRICT_TRANS_TABLES的作用。
2、NO_ZERO_IN_DATE
将其加入到sql_model之后,MySQL将不允许你将诸如 0000-10-10、2020-00-10、2020-10-00等年份、月份、日期为零的值插入到Date列中。
目前该参数处于目前该参数默认会生效,但是在未来的版本中将会被删除。
3、NO_ZERO_DATE:
该参数控制MySQL是否允许将 ‘0000-00-00’作为有效日期。
如果未启用此模式, ‘0000-00-00’允许插入不会产生警告。
如果启用此模式,’0000-00-00’ 允许插入且产生警告。
如果启用了此模式和严格模式, ‘0000-00-00’ 插入产生错误,除非 IGNORE同样给出。对于 INSERT IGNORE和UPDATE IGNORE,’0000-00-00’允许插入且产生警告。