🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
> MySQL 5.7 中的默认 SQL 模式包括这些 模式:[`ONLY_FULL_GROUP_BY`](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by)、[`STRICT_TRANS_TABLES`](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_strict_trans_tables)、[`NO_ZERO_IN_DATE`](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_in_date)、[`NO_ZERO_DATE`](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_date)、[`ERROR_FOR_DIVISION_BY_ZERO`](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_error_for_division_by_zero)、[`NO_AUTO_CREATE_USER`](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_auto_create_user)和[`NO_ENGINE_SUBSTITUTION`](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_engine_substitution)。 MySQL 8.0 中的默认 SQL 模式包括这些 模式:[`ONLY_FULL_GROUP_BY`](https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_only_full_group_by)、[`STRICT_TRANS_TABLES`](https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_strict_trans_tables)、[`NO_ZERO_IN_DATE`](https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_no_zero_in_date)、[`NO_ZERO_DATE`](https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_no_zero_date)、[`ERROR_FOR_DIVISION_BY_ZERO`](https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_error_for_division_by_zero)、 和[`NO_ENGINE_SUBSTITUTION`](https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_no_engine_substitution)。 ## **ONLY_FULL_GROUP_BY** 拒绝选择列表、条件或列表引用的非聚合列的查询,这些列既没有在子句中命名,也没有在功能上依赖于(由列唯一确定的)列。 ## **STRICT_TRANS_TABLES** 如果设置STRICT模式,则如果数据写入时,如果数据不符合字段定义(字符串超出长度、数值类型数据超出范围、违反not null约束等),SQL会报错。 如果不设置STRICT模式,会对异常数据进行截断处理,SQL会显示Warning,但不报错。 ### STRICT_TRANS_TABLES 如果设置strict_trans_tables SQL_MODE,则只影响事物型存储引擎。不影响往非事务型引擎中写入非法数据。 ### STRICT_ALL_TABLES 对于非事务型存储引擎如MyISAM,可能会出现批量Insert中部分数据写入成功、部分数据写入失败的情况。事务型存储引擎如InnoDB不存在该问题。 ## **NO_ZERO_IN_DATE** 服务器是否允许年部分不为零但月或日部分为0的日期。NO_ZERO_IN_DATE的效果还取决于是否启用了严格SQL模式。“2010-00-01“2010-01-00”2010-00-01“2010-00-01”。 - 如果不启用此模式,则允许零部件的日期,并且插入不会产生警告。 - 如果启用此模式,则插入零部分的日期,并产生警告。“0000-00-00” - 如果启用了此模式和严格模式,则不允许包含零部分的日期,并且插入会产生错误 *NO_ZERO_IN_DATE已弃用。NO_ZERO_IN_DATE不是严格模式的一部分,但应该与严格模式一起使用,默认情况下是启用的。如果启用了NO_ZERO_IN_DATE而没有同时启用严格模式,则会出现警告,反之亦然。* ## **NO_ZERO_DATE** 模式影响服务器是否允许'0000-00-00'作为有效日期。它的效果还取决于是否启用了严格SQL模式。 - 如果未启用此模式,则允许使用'0000-00-00',并且插入不会产生警告。 - 如果启用此模式,则允许使用'0000-00-00',并且插入会产生警告。 - 如果启用了此模式和严格模式,则不允许使用'0000-00-00',并且插入会产生错误 *NO_ZERO_DATE已弃用。NO_ZERO_DATE不是严格模式的一部分,但应该与严格模式一起使用,默认情况下是启用的。如果启用了NO_ZERO_DATE而没有同时启用严格模式,则会出现警告,反之亦然* ## **ERROR_FOR_DIVISION_BY_ZERO** 模式影响除零的处理,包括MOD(N,0)。对于数据更改操作(INSERT、UPDATE),其效果还取决于是否启用了严格的SQL模式。 - 如果不启用此模式,除零将插入NULL并且不产生警告。 - 如果启用此模式,除零将插入NULL并产生警告。 - 如果启用了此模式和严格模式,除零会产生错误, ## **NO_AUTO_CREATE_USER** 防止GRANT语句自动创建新用户帐户,除非指定了身份验证信息。 ## **NO_ENGINE_SUBSTITUTION** 当CREATE TABLE或ALTER TABLE等语句指定禁用或未编译的存储引擎时,控制默认存储引擎的自动替换。缺省情况下,NO_ENGINE_SUBSTITUTION是启用的。 禁用NO_ENGINE_SUBSTITUTION后,CREATE TABLE将使用默认引擎,如果所需的引擎不可用,则会出现警告。对于ALTER TABLE,会出现警告,并且不会更改表。 启用NO_ENGINE_SUBSTITUTION后,如果所需的引擎不可用,则会发生错误,并且不会创建或更改表。