当前位置: 首页 > news >正文

网站开发用的电脑百度推广登录网站

网站开发用的电脑,百度推广登录网站,中信建设有限责任公司助理杨建强,南海网站建设哪家好官网地址:MySQL :: MySQL 5.7 Reference Manual :: 5.1.10 Server SQL Modes 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. MySQL 5.7 参考手册 / ... / 服务器 SQL 模式 5.1.10 服务器 SQL 模式…

  官网地址:MySQL :: MySQL 5.7 Reference Manual :: 5.1.10 Server SQL Modes

欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯.

MySQL 5.7 参考手册  /  ...  /  服务器 SQL 模式

5.1.10 服务器 SQL 模式

MySQL服务器可以在不同的SQL模式下运行,并且可以根据系统变量的值对不同的客户端应用不同的模式sql_mode。DBA 可以设置全局 SQL 模式来匹配站点服务器操作要求,每个应用程序可以根据自己的要求设置其会话 SQL 模式。

模式影响 MySQL 支持的 SQL 语法及其执行的数据验证检查。这使得在不同的环境中使用MySQL以及将MySQL与其他数据库服务器一起使用变得更加容易。

  • 设置SQL模式

  • 最重要的 SQL 模式

  • SQL 模式的完整列表

  • 组合 SQL 模式

  • 严格SQL模式

  • IGNORE 关键字与严格 SQL 模式的比较

  • MySQL 5.7 中的 SQL 模式更改

有关 MySQL 中服务器 SQL 模式的常见问题的解答,请参阅第 A.3 节“MySQL 5.7 常见问题解答:服务器 SQL 模式”。

使用InnoDB表时,还要考虑innodb_strict_mode系统变量。它可以对表进行额外的错误检查 InnoDB

设置SQL模式

MySQL 5.7 中默认的 SQL 模式包括以下模式:ONLY_FULL_GROUP_BY、 STRICT_TRANS_TABLES、 NO_ZERO_IN_DATE、 NO_ZERO_DATE、 ERROR_FOR_DIVISION_BY_ZERO、 NO_AUTO_CREATE_USER和 NO_ENGINE_SUBSTITUTION

这些模式被添加到 MySQL 5.7 中的默认 SQL 模式中: MySQL 5.7.5 中添加了ONLY_FULL_GROUP_BY和 模式。STRICT_TRANS_TABLES该 NO_AUTO_CREATE_USER模式是在 MySQL 5.7.7 中添加的。MySQL 5.7.8 中添加了ERROR_FOR_DIVISION_BY_ZERO、 NO_ZERO_DATE、 和 模式 。NO_ZERO_IN_DATE有关对默认 SQL 模式值的这些更改的更多讨论,请参阅 MySQL 5.7 中的 SQL 模式更改。

要在服务器启动时设置 SQL 模式,请 在命令行或 选项文件(例如(Unix 操作系统)或(Windows))中使用该选项。 是用逗号分隔的不同模式的列表。要显式清除 SQL 模式,请在命令行或选项文件中 使用将其设置为空字符串 。--sql-mode="modes"sql-mode="modes"my.cnfmy.inimodes--sql-mode=""sql-mode=""

笔记

MySQL安装程序可能会在安装过程中配置SQL模式。如果 SQL 模式与默认值或您期望的不同,请检查服务器在启动时读取的选项文件中的设置。

要在运行时更改 SQL 模式,请使用以下语句设置全局或会话 sql_mode系统变量SET :

SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';

设置该GLOBAL变量需要 SUPER特权,并会影响从那时起连接的所有客户端的操作。设置SESSION变量仅影响当前客户端。每个客户端都可以 sql_mode随时更改其会话值。

要确定当前的全局或会话 sql_mode设置,请选择其值:

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
重要的

SQL模式和用户定义的分区。  创建数据并将其插入分区表后更改服务器 SQL 模式可能会导致此类表的行为发生重大变化,并可能导致数据丢失或损坏。强烈建议您在创建使用用户定义分区的表后不要更改 SQL 模式。

复制分区表时,源和副本上不同的 SQL 模式也可能导致问题。为了获得最佳结果,您应该始终在源和副本上使用相同的服务器 SQL 模式。

有关更多信息,请参阅 第 22.6 节“分区的约束和限制”。

最重要的 SQL 模式

最重要的sql_mode 值可能是这些:

当本手册提到“严格模式”STRICT_TRANS_TABLES时,它是指启用其中一个或两个或 启用的模式 STRICT_ALL_TABLES

SQL 模式的完整列表

以下列表描述了所有支持的 SQL 模式:

组合 SQL 模式

提供以下特殊模式作为前面列表中模式值组合的简写。

严格SQL模式

严格模式控制 MySQL 如何处理数据更改语句中的无效值或缺失值,例如 INSERT或 UPDATE。由于多种原因,值可能无效。例如,列的数据类型可能错误,或者可能超出范围。NULL当要插入的新行不包含其定义中没有显式 子句的非列的值时,就会缺少值DEFAULT。(对于 NULL列,NULL如果值缺失,则插入。)严格模式还会影响 DDL 语句,例如CREATE TABLE.

如果严格模式未生效,MySQL 会插入无效或缺失值的调整值并产生警告(请参见 第 13.7.5.40 节“SHOW WARNINGS 语句”)。INSERT IGNORE 在严格模式下,您可以通过使用或来产生此行为 UPDATE IGNORE。

对于诸如不更改数据之类的语句SELECT ,无效值在严格模式下会生成警告,而不是错误。

如果尝试创建超过最大密钥长度的密钥,严格模式会产生错误。当未启用严格模式时,这会导致警告并将密钥截断为最大密钥长度。

严格模式不影响是否检查外键约束。foreign_key_checks可以用于此目的。(请参见 第 5.1.7 节“服务器系统变量”。)

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

  • 对于事务表,当启用STRICT_ALL_TABLES或 时 ,数据更改语句中的值无效或缺失会发生错误 。STRICT_TRANS_TABLES该语句被中止并回滚。

  • 对于非事务表,如果在要插入或更新的第一行中出现错误值,则任一模式的行为都是相同的:语句将中止并且表保持不变。如果语句插入或修改多行,并且错误值出现在第二行或后面的行中,则结果取决于启用了哪种严格模式:

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

    • 对于 STRICT_TRANS_TABLES,MySQL 会将无效值转换为该列最接近的有效值,并插入调整后的值。如果缺少值,MySQL 会插入列数据类型的隐式默认值。无论哪种情况,MySQL 都会生成警告而不是错误,并继续处理该语句。第 11.6 节“数据类型默认值”中描述了隐式默认值。

严格模式会影响除以零、零日期和日期中的零的处理,如下所示:

  • 严格模式影响除以零的处理,其中包括 : MOD(N,0)

    对于数据更改操作 ( INSERT, UPDATE):

    • 如果未启用严格模式,则除以零插入 NULL并且不会产生警告。

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

    对于SELECT,除以零返回NULL。启用严格模式也会导致生成警告。

  • 严格模式会影响服务器是否允许 '0000-00-00'作为有效日期:

    • 如果未启用严格模式, '0000-00-00'则允许并且插入不会产生警告。

    • 如果启用了严格模式,则 '0000-00-00'不允许并且插入会产生错误,除非 IGNORE也给出了。对于 INSERT IGNOREUPDATE IGNORE,'0000-00-00'是允许的并且插入会产生警告。

  • 严格模式会影响服务器是否允许年部分非零但月或日部分为 0 的日期(例如'2010-00-01'或 '2010-01-00'):

    • 如果未启用严格模式,则允许包含零部分的日期并且插入不会产生警告。

    • 如果启用严格模式,则不允许包含零部分的日期,并且插入会产生错误,除非 IGNORE也给出了。对于 INSERT IGNOREUPDATE IGNORE,零部分的日期将被插入为 '0000-00-00'(对于 被认为有效IGNORE)并产生警告。

有关严格模式的详细信息 IGNORE,请参阅 IGNORE 关键字和严格 SQL 模式的比较。

在 MySQL 5.7.4 之前以及在 MySQL 5.7.8 及更高版本中,严格模式会影响除以零、零日期以及与 、 和 模式结合使用的日期中的零 ERROR_FOR_DIVISION_BY_ZERO的 NO_ZERO_DATE处理 NO_ZERO_IN_DATE。从 MySQL 5.7.4 到 5.7.7, ERROR_FOR_DIVISION_BY_ZERO、 NO_ZERO_DATE和 NO_ZERO_IN_DATE模式在显式命名时不执行任何操作,并且它们的效果包含在严格模式的效果中。有关更多讨论,请参阅 MySQL 5.7 中的 SQL 模式更改。

IGNORE 关键字与严格 SQL 模式的比较

IGNORE本节比较关键字(将错误降级为警告)和严格 SQL 模式(将警告升级为错误) 对语句执行的影响 。它描述了它们影响哪些语句以及它们适用于哪些错误。

下表总结了默认情况下生成错误与警告时语句行为的比较。默认情况下会产生错误的一个示例是将 a 插入NULLNOT NULL列中。默认情况下产生警告的一个示例是将错误数据类型的值插入到列中(例如将字符串插入 'abc'到整数列中)。

运作模式当语句默认为错误时当语句默认为警告时
IGNORE或严格 SQL 模式错误警告
IGNORE警告IGNORE警告(与无或严格 SQL 模式相同)
具有严格的SQL模式IGNORE错误(与无或严格 SQL 模式相同)错误
withIGNORE和严格的 SQL 模式警告警告

从表中得出的一个结论是,当 IGNORE关键字和严格 SQL 模式同时生效时,IGNORE优先。这意味着,尽管IGNORE可以认为严格 SQL 模式对错误处理具有相反的效果,但它们一起使用时不会取消。

  • IGNORE 对语句执行的影响

  • 严格SQL模式对语句执行的影响

IGNORE 对语句执行的影响

MySQL 中的一些语句支持可选 IGNORE关键字。此关键字会导致服务器降级某些类型的错误并生成警告。对于多行语句,将错误降级为警告可能会使行得到处理。否则, IGNORE导致语句跳到下一行而不是中止。(对于不可忽略的错误,无论关键字如何,都会发生错误IGNORE。)

示例:如果表t的主键列i包含唯一值,则尝试将相同的值插入i多行通常会产生重复键错误:

mysql> CREATE TABLE t (i INT NOT NULL PRIMARY KEY);
mysql> INSERT INTO t (i) VALUES(1),(1);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

使用 时IGNORE,包含重复键的行仍然不会被插入,但会出现警告而不是错误:

mysql> INSERT IGNORE INTO t (i) VALUES(1),(1);
Query OK, 1 row affected, 1 warning (0.01 sec)
Records: 2  Duplicates: 1  Warnings: 1mysql> SHOW WARNINGS;
+---------+------+---------------------------------------+
| Level   | Code | Message                               |
+---------+------+---------------------------------------+
| Warning | 1062 | Duplicate entry '1' for key 'PRIMARY' |
+---------+------+---------------------------------------+
1 row in set (0.00 sec)

示例:如果表t2有一NOT NULLid,则尝试插入NULL会在严格 SQL 模式下产生错误:

mysql> CREATE TABLE t2 (id INT NOT NULL);
mysql> INSERT INTO t2 (id) VALUES(1),(NULL),(3);
ERROR 1048 (23000): Column 'id' cannot be null
mysql> SELECT * FROM t2;
Empty set (0.00 sec)

如果 SQL 模式不严格,IGNORE则会导致NULL被插入为列隐式默认值(在本例中为 0),这使得能够在不跳过该行的情况下处理该行:

mysql> INSERT INTO t2 (id) VALUES(1),(NULL),(3);
mysql> SELECT * FROM t2;
+----+
| id |
+----+
|  1 |
|  0 |
|  3 |
+----+

这些语句支持IGNORE关键字:

IGNORE关键字适用于以下可忽略的错误:

ER_BAD_NULL_ERROR
ER_DUP_ENTRY
ER_DUP_ENTRY_WITH_KEY_NAME
ER_DUP_KEY
ER_NO_PARTITION_FOR_GIVEN_VALUE
ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT
ER_NO_REFERENCED_ROW_2
ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET
ER_ROW_IS_REFERENCED_2
ER_SUBQUERY_NO_1_ROW
ER_VIEW_CHECK_FAILED
严格SQL模式对语句执行的影响

MySQL服务器可以在不同的SQL模式下运行,并且可以根据系统变量的值对不同的客户端应用不同的模式sql_mode 。在“严格” SQL模式下,服务器将某些警告升级为错误。

例如,在非严格 SQL 模式下,将字符串插入 'abc'整数列会导致值转换为 0 并发出警告:

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO t (i) VALUES('abc');
Query OK, 1 row affected, 1 warning (0.01 sec)mysql> SHOW WARNINGS;
+---------+------+--------------------------------------------------------+
| Level   | Code | Message                                                |
+---------+------+--------------------------------------------------------+
| Warning | 1366 | Incorrect integer value: 'abc' for column 'i' at row 1 |
+---------+------+--------------------------------------------------------+
1 row in set (0.00 sec)

在严格 SQL 模式下,无效值将被拒绝并出现错误:

mysql> SET sql_mode = 'STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO t (i) VALUES('abc');
ERROR 1366 (HY000): Incorrect integer value: 'abc' for column 'i' at row 1

有关 sql_mode系统变量的可能设置的更多信息,请参见 第 5.1.10 节 “服务器 SQL 模式”。

严格 SQL 模式适用于某些值可能超出范围或在表中插入或删除无效行的情况下的以下语句:

  • ALTER TABLE

  • CREATE TABLE

  • CREATE TABLE ... SELECT

  • DELETE(单表和多表均可)

  • INSERT

  • LOAD DATA

  • LOAD XML

  • SELECT SLEEP()

  • UPDATE(单表和多表均可)

在存储程序中,如果程序是在严格模式有效时定义的,则刚刚列出的类型的各个语句将以严格 SQL 模式执行。

严格 SQL 模式适用于以下错误,这些错误代表输入值无效或丢失的一类错误。如果某个值的列数据类型错误或者可能超出范围,则该值无效。如果要插入的新行不包含定义中 NOT NULL没有显式子句的列 的值,则缺少值。DEFAULT

ER_BAD_NULL_ERROR
ER_CUT_VALUE_GROUP_CONCAT
ER_DATA_TOO_LONG
ER_DATETIME_FUNCTION_OVERFLOW
ER_DIVISION_BY_ZERO
ER_INVALID_ARGUMENT_FOR_LOGARITHM
ER_NO_DEFAULT_FOR_FIELD
ER_NO_DEFAULT_FOR_VIEW_FIELD
ER_TOO_LONG_KEY
ER_TRUNCATED_WRONG_VALUE
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
ER_WARN_DATA_OUT_OF_RANGE
ER_WARN_NULL_TO_NOTNULL
ER_WARN_TOO_FEW_RECORDS
ER_WRONG_ARGUMENTS
ER_WRONG_VALUE_FOR_TYPE
WARN_DATA_TRUNCATED
笔记

由于 MySQL 的持续开发定义了新的错误,因此可能存在不属于上述严格 SQL 模式适用的错误。

MySQL 5.7 中的 SQL 模式更改

在 MySQL 5.7.22 中,这些 SQL 模式已被弃用并在 MySQL 8.0 中被删除:DB2, MAXDB, MSSQL, MYSQL323, MYSQL40, ORACLE, POSTGRESQL, NO_FIELD_OPTIONS, NO_KEY_OPTIONS, NO_TABLE_OPTIONS。

在 MySQL 5.7 中, ONLY_FULL_GROUP_BY默认启用 SQL 模式,因为GROUP BY 处理变得更加复杂,包括检测函数依赖性。但是,如果您发现 ONLY_FULL_GROUP_BY启用导致对现有应用程序的查询被拒绝,则以下任一操作都应该恢复操作:

  • 如果可以修改有问题的查询,请这样做,以便非聚合列在功能上依赖于GROUP BY列,或者通过使用 引用非聚合列 ANY_VALUE()。

  • 如果无法修改有问题的查询(例如,如果它是由第三方应用程序生成的),请sql_mode在服务器启动时将系统变量设置为 not enable ONLY_FULL_GROUP_BY。

在 MySQL 5.7 中, 不推荐使用 、 和 SQLERROR_FOR_DIVISION_BY_ZERO模式 NO_ZERO_DATE。 NO_ZERO_IN_DATE长期计划是将这三种模式包含在严格 SQL 模式中,并在 MySQL 的未来版本中将它们作为显式模式删除。为了使 MySQL 5.7 与 MySQL 5.6 严格模式兼容,并为修改受影响的应用程序提供额外的时间,以下行为适用:

  • ERROR_FOR_DIVISION_BY_ZERO、 NO_ZERO_DATE、 和 NO_ZERO_IN_DATE不是严格 SQL 模式的一部分,但它们旨在与严格模式一起使用。提醒一下,如果在未启用严格模式的情况下启用它们,则会出现警告,反之亦然。

  • ERROR_FOR_DIVISION_BY_ZERO、 NO_ZERO_DATE、 和 NO_ZERO_IN_DATE默认情况下启用。

通过上述更改,默认情况下仍会启用更严格的数据检查,但可以在当前需要或有必要的环境中禁用各个模式。

http://www.ds6.com.cn/news/72928.html

相关文章:

  • 查询建设银行卡卡号网站杭州网站外包
  • wordpress新手教程seo网站优化培训
  • 专业开发网站公司郑州免费做网站
  • 网站建设技术网站建设百度竞价怎么做效果好
  • 有没有专业做淘宝网站谷歌搜索引擎镜像
  • 做的比较炫的网站网站建设是干什么的
  • 南通网站建设找哪家好百度电脑版下载官方
  • web做花店网站页面推广竞价账户托管
  • 文库网站怎么做seo百度竞价开户联系方式
  • 网站建设方案 报价seo入门教程seo入门
  • 阿里云网站备案网站建设方案书域名收录查询
  • 雅奇小蘑菇做网站好不好用最强大的搜索引擎
  • 网站版块设计是什么意思外链seo招聘
  • 怎样简单做网站培训机构加盟店排行榜
  • 新余seo武汉seo学徒
  • 河南建造师网官网企业新网站seo推广
  • 网站代码跑偏了怎么做武汉seo百度
  • 政府网站建设策划天津百度
  • 测速网站怎么做推广运营公司哪家好
  • 什么网站做新闻更好百度推广计划
  • 贵阳百度做网站电话北京首页关键词优化
  • 郑州服装网站建设淘宝直通车推广怎么做
  • 常德网站建设广告软文范例大全100字
  • 简易的网站制作河南网站建设哪家公司好
  • 最新企业网站开发和设计软件网页设计个人网站
  • 后台网站要做权限前端还是后台做邯郸网站优化
  • 苹果app制作软件seo案例视频教程
  • 宁波网站建设计关键词网站查询
  • 网站设计需要什么软件提高工作效率图片
  • 全国建筑四库一平台seo全站优化全案例