专栏首页sunskyMysql服务器SQL模式 (官方精译)

Mysql服务器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 FAQ:服务器SQL模式”。

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

设置SQL模式

在MySQL 5.7的默认SQL模式包括以下模式:ONLY_FULL_GROUP_BYSTRICT_TRANS_TABLESNO_ZERO_IN_DATENO_ZERO_DATEERROR_FOR_DIVISION_BY_ZERONO_AUTO_CREATE_USER,和 NO_ENGINE_SUBSTITUTION

ONLY_FULL_GROUP_BYSTRICT_TRANS_TABLES模式在MySQL 5.7.5添加。该 NO_AUTO_CREATE_USER模式已添加到MySQL 5.7.7。这些 ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATENO_ZERO_IN_DATE模式被添加到MySQL 5.7.8。有关对默认SQL模式值的这些更改的更多讨论,请参阅 MySQL 5.7中的SQL模式更改。

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

注意

MySQL安装程序可能会在安装过程中配置SQL模式。例如, mysql_install_db将创建一个my.cnf在基本安装目录中命名的默认选项文件。该文件包含设置SQL模式的行; 请参见第4.4.2节“ mysql_install_db- 初始化MySQL数据目录”。

如果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 价值可能是这些:

  • ANSI 此模式更改语法和行为以更加符合标准SQL。这是 本节最后列出的特殊 组合模式之一。
  • STRICT_TRANS_TABLES 如果某个值无法插入到事务表中,请中止该语句。对于非事务性表,如果该值出现在单行语句或多行语句的第一行中,则中止该语句。更多细节在本节后面给出。 从MySQL 5.7.5开始,默认的SQL模式包括 STRICT_TRANS_TABLES
  • TRADITIONAL 使MySQL像“ 传统 ”的 SQL数据库系统一样行事。在将不正确的值插入列时,此模式的简单描述是 “ 给出错误而不是警告 ”。这是本节最后列出的特殊组合模式之一。 注意 在INSERTUPDATE只要误差注意到中止。如果您使用的是非事务性存储引擎,则这可能不是您想要的,因为在错误之前进行的数据更改可能无法回滚,从而导致“ 部分完成 ”更新。

当本手册提到“ 严格模式 ”时,它表示具有一个或两个STRICT_TRANS_TABLESSTRICT_ALL_TABLES启用的模式 。

SQL模式的完整列表

以下列表介绍了所有支持的SQL模式:

  • ALLOW_INVALID_DATES 不要执行完整的日期检查。只检查月份是在1到12之间,日期是在1到31之间。这对于在三个不同领域获得年份,月份和日期的Web应用程序非常方便,并且您想要存储究竟是用户插入(没有日期验证)。此模式适用于 DATEDATETIME列。它不适用TIMESTAMP列,这总是需要一个有效的日期。 服务器要求月份和日期值是合法的,而不是分别在1到12和1到31的范围内。禁用严格模式后,会生成'2004-04-31'转换为 无效日期 '0000-00-00'和警告。启用严格模式后,无效的日期会生成错误。要允许这样的日期,请启用ALLOW_INVALID_DATES
  • ANSI_QUOTES 治疗"作为标识符引号字符(如`引号字符),而不是作为一个字符串引号字符。您仍然可以使用 `引用启用此模式的标识符。与ANSI_QUOTES 启用,则不能使用双引号引用文字字符串,因为它被解释为标识符。
  • ERROR_FOR_DIVISION_BY_ZEROERROR_FOR_DIVISION_BY_ZERO 模式影响零除的处理,其中包括 。对于数据更改操作(, ),其效果也取决于严格SQL模式是否启用。 MOD(N,0)INSERTUPDATE
    • 如果这个模式没有被启用,除以零插入 NULL并且不产生警告。
    • 如果启用此模式,则除以零插入 NULL并产生警告。
    • 如果这个模式和严格的模式被启用,除以零产生一个错误,除非IGNORE 给出。对于INSERT IGNOREUPDATE IGNORE,除以零插入NULL并产生一个警告。

    因为SELECT,除以零回报NULLERROR_FOR_DIVISION_BY_ZERO 无论是否启用严格模式,启用 都会导致产生警告。 从MySQL 5.7.4开始, ERROR_FOR_DIVISION_BY_ZERO 已被弃用。在MySQL 5.7.4到5.7.7中,ERROR_FOR_DIVISION_BY_ZERO 当明确命名时什么都不做。相反,其效果包含在严格SQL模式的效果中。在MySQL 5.7.8及更高版本中, ERROR_FOR_DIVISION_BY_ZERO 如果明确命名,并且不是严格模式的一部分,就像在MySQL 5.7.4之前一样。但是,它应该与严格模式一起使用,并且默认情况下处于启用状态。如果ERROR_FOR_DIVISION_BY_ZERO 在未启用严格模式的情况下启用警告, 反之亦然。有关其他讨论,请参阅 MySQL 5.7中的SQL模式更改。 由于 ERROR_FOR_DIVISION_BY_ZERO 已被弃用,它将在未来的MySQL版本中作为单独的模式名称被删除,其效果包含在严格SQL模式的影响中。

  • HIGH_NOT_PRECEDENCE NOT 运算符 的优先级是这样的表达式,如NOT a BETWEEN b AND c解析为NOT (a BETWEEN b AND c)。在一些旧版本的MySQL中,表达式被解析为(NOT a) BETWEEN b AND c。旧的高优先级行为可以通过启用HIGH_NOT_PRECEDENCESQL模式来获得 。 mysql> SET sql_mode = ''; mysql> SELECT NOT 1 BETWEEN -5 AND 5; -> 0 mysql> SET sql_mode = 'HIGH_NOT_PRECEDENCE'; mysql> SELECT NOT 1 BETWEEN -5 AND 5; -> 1
  • IGNORE_SPACE 允许函数名称和(字符之间的空格 。这导致内置函数名称被视为保留字。因此,必须按照第9.2节“模式对象名称”中的描述引用与函数名称相同的标识符。例如,因为有一个 COUNT()函数,count在下面的语句中使用 作为表名称会导致一个错误: mysql> CREATE TABLE count (i INT); ERROR 1064 (42000): You have an error in your SQL syntax 表名应该引用: mysql> CREATE TABLE `count` (i INT); Query OK, 0 rows affected (0.00 sec) 在IGNORE_SPACESQL模式适用于内置函数,而不是用户定义的函数或存储功能。无论是否IGNORE_SPACE启用,总是允许在UDF或存储的函数名称后面有空格 。 有关进一步讨论 IGNORE_SPACE,请参见 第9.2.4节“函数名称分析和解析”。
  • NO_AUTO_CREATE_USER 防止GRANT声明自动创建新的用户帐户,除非认证信息被指定。该语句必须使用IDENTIFIED BY或使用身份验证插件指定非空密码IDENTIFIED WITH。 最好是创建MySQL帐户 CREATE USER而不是 GRANTNO_AUTO_CREATE_USER已弃用,默认的SQL模式包括NO_AUTO_CREATE_USER。分配给sql_mode 该改变 NO_AUTO_CREATE_USER模式状态产生警告,除了设置分配sql_modeDEFAULTNO_AUTO_CREATE_USER将在未来的MySQL版本中被删除,此时其效果将始终启用(GRANT不会创建帐户)。 以前,NO_AUTO_CREATE_USER弃用之前 ,不能启用它的一个原因是它不是复制安全的。现在,它可以启用和进行复制,安全的用户管理CREATE USER IF NOT EXISTSDROP USER IF EXISTSALTER USER IF EXISTS而不是GRANT。当从属服务器与主服务器上的授权不同时,这些语句可以实现安全复制。请参见第13.7.1.2节“CREATE USER语法”, 第13.7.1.3节“DROP USER语法”和 第13.7.1.1节“ALTER USER语法”。
  • NO_AUTO_VALUE_ON_ZERO NO_AUTO_VALUE_ON_ZERO 影响AUTO_INCREMENT 列的处理。通常情况下,通过插入NULL或 插入,为列生成下一个序列号0NO_AUTO_VALUE_ON_ZERO 为了0NULL产生下一个序列号就抑制了这种行为。 如果0已经存储在表格的AUTO_INCREMENT 列中,此模式可能很有用。(0顺便说一句,存储不是推荐的做法。)例如,如果您使用mysqldump转储表,然后重新加载它,MySQL通常会在遇到0值时生成新的序列号,从而导致与内容不同的表被甩了 NO_AUTO_VALUE_ON_ZERO 重新加载转储文件之前启用 解决此问题。 mysqldump现在会自动在其输出中包含一个使能的语句 NO_AUTO_VALUE_ON_ZERO,以避免这个问题。
  • NO_BACKSLASH_ESCAPES 禁止\在字符串中使用反斜杠字符()作为转义字符。启用此模式后,反斜杠将变成普通字符一样。
  • NO_DIR_IN_CREATE 创建表格时,忽略所有INDEX DIRECTORYDATA DIRECTORY 指令。该选项在从属复制服务器上很有用。
  • NO_ENGINE_SUBSTITUTION 控制默认存储引擎的自动替换,例如CREATE TABLE或者ALTER TABLE指定了禁用或未编译的存储引擎。 默认的SQL模式包括 NO_ENGINE_SUBSTITUTION。 因为存储引擎在运行时可以被插入,所以不可用的引擎被以同样的方式处理: 在 NO_ENGINE_SUBSTITUTION 禁用CREATE TABLE 的情况下,使用默认引擎,如果所需引擎不可用,则会发生警告。因为 ALTER TABLE,发生警告,表格没有被改变。 与 NO_ENGINE_SUBSTITUTION 启用,则会出现错误,并且不会创建或修改的表,如果所需的引擎不可用。
  • NO_FIELD_OPTIONS 不要在输出中打印MySQL特定的列选项 SHOW CREATE TABLE。这种模式在可移植性模式下被mysqldump使用。
  • NO_KEY_OPTIONS 不要在输出中打印MySQL特定的索引选项 SHOW CREATE TABLE。这种模式在可移植性模式下被mysqldump使用。
  • NO_TABLE_OPTIONS 不要ENGINE在输出中打印MySQL特定的表选项(如 ) SHOW CREATE TABLE。这种模式在可移植性模式下被mysqldump使用。
 NO_UNSIGNED_SUBTRACTION
 整数值之间的减法,其中一个是类型的 UNSIGNED,默认情况下会生成一个无符号的结果。如果结果否则会导致错误:
  mysql> SET sql_mode = ''; Query OK, 0 rows affected (0.00 sec)  mysql> SELECT CAST(0 AS UNSIGNED) - 1; ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
 
 如果NO_UNSIGNED_SUBTRACTION 启用了 SQL模式,结果是否定的:
  mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST(0 AS UNSIGNED) - 1; +-------------------------+ | CAST(0 AS UNSIGNED) - 1 | +-------------------------+ |                      -1 | +-------------------------+
 
 如果此操作的结果用于更新 UNSIGNED整数列,则结果将被剪裁为列类型的最大值,如果NO_UNSIGNED_SUBTRACTION启用,则剪切为0 。如果启用严格的SQL模式,则会发生错误,并且列保持不变。
 当 NO_UNSIGNED_SUBTRACTION使能时,即使有任何操作数是无符号的,减法结果也是有符号的。例如,比较列的类型c2在表 t1与该列的 c2表t2:
  mysql> SET sql_mode=''; mysql> CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL); mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t1; +-------+---------------------+------+-----+---------+-------+ | Field | Type                | Null | Key | Default | Extra | +-------+---------------------+------+-----+---------+-------+ | c2    | bigint(21) unsigned | NO   |     | 0       |       | +-------+---------------------+------+-----+---------+-------+  mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION'; mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t2; +-------+------------+------+-----+---------+-------+ | Field | Type       | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | c2    | bigint(21) | NO   |     | 0       |       | +-------+------------+------+-----+---------+-------+
 
 这意味着BIGINT UNSIGNED在所有情况下都不是100%可用的。请参见 第12.10节“演算函数和操作符”。
 
  • NO_ZERO_DATENO_ZERO_DATE模式影响服务器是否允许 '0000-00-00'作为有效日期。其效果也取决于是否启用严格的SQL模式。
    • 如果此模式未启用, '0000-00-00'则允许插入,不会产生警告。
    • 如果启用此模式,'0000-00-00' 则允许并插入产生警告。
    • 如果启用了此模式和严格模式, '0000-00-00'则不允许插入,并且插入会产生错误,除非 IGNORE给出。为INSERT IGNOREUPDATE IGNORE'0000-00-00'被允许和插入产生警告。

    从MySQL 5.7.4开始, NO_ZERO_DATE已被弃用。在MySQL 5.7.4到5.7.7中, NO_ZERO_DATE当明确命名时什么都不做。相反,其效果包含在严格SQL模式的效果中。在MySQL 5.7.8及更高版本中, NO_ZERO_DATE如果明确命名,并且不是严格模式的一部分,就像在MySQL 5.7.4之前一样。但是,它应该与严格模式一起使用,并且默认情况下处于启用状态。如果NO_ZERO_DATE在未启用严格模式的情况下启用警告, 反之亦然。有关其他讨论,请参阅 MySQL 5.7中的SQL模式更改。 由于NO_ZERO_DATE已被弃用,它将在未来的MySQL版本中作为单独的模式名称被删除,其效果包含在严格SQL模式的影响中。

  • NO_ZERO_IN_DATENO_ZERO_IN_DATE模式会影响服务器是否允许年份不为零,但月份或日期部分为0的日期。(此模式会影响日期,例如'2010-00-01''2010-01-00',但不会 影响'0000-00-00'服务器是否允许'0000-00-00'使用 NO_ZERO_DATE模式。)影响的NO_ZERO_IN_DATE 还取决于是否启用严格的SQL模式。
    • 如果此模式未启用,则允许使用零部件的日期,插入不会产生警告。
    • 如果启用此模式,则将零件的日期插入'0000-00-00'并产生警告。
    • 如果启用了此模式和严格模式,则不允许包含零件的日期,插入会产生错误,除非IGNORE给出。对于INSERT IGNOREUPDATE IGNORE,与零部件日期是否插'0000-00-00'和产生警告。

    从MySQL 5.7.4开始, NO_ZERO_IN_DATE已被弃用。在MySQL 5.7.4到5.7.7中, NO_ZERO_IN_DATE当明确命名时什么都不做。相反,其效果包含在严格SQL模式的效果中。在MySQL 5.7.8及更高版本中,NO_ZERO_IN_DATE 如果明确命名,并且不是严格模式的一部分,就像在MySQL 5.7.4之前一样。但是,它应该与严格模式一起使用,并且默认情况下处于启用状态。如果NO_ZERO_IN_DATE在未启用严格模式的情况下启用警告, 反之亦然。有关其他讨论,请参阅MySQL 5.7中的SQL模式更改。 由于NO_ZERO_IN_DATE已被弃用,它将在未来的MySQL版本中作为单独的模式名称被删除,其效果包含在严格SQL模式的影响中。

  • ONLY_FULL_GROUP_BY 拒绝对选择列表, HAVING条件或ORDER BY列表引用既未在GROUP BY子句中命名也未在功能上依赖(由GROUP BY列唯一确定)的非 聚合列的查询。 从MySQL 5.7.5开始,默认的SQL模式包括 ONLY_FULL_GROUP_BY。(在5.7.5之前,MySQL没有检测到函数依赖,并且ONLY_FULL_GROUP_BY默认情况下是不启用的。关于5.7.5之前的行为的描述,请参阅MySQL 5.6参考手册。 标准SQL的MySQL扩展允许在HAVING子句中引用 选择列表中的别名表达式。在MySQL 5.7.5之前,启用ONLY_FULL_GROUP_BY 禁用这个扩展,因此需要 HAVING使用非混淆表达式来写入子句。从MySQL 5.7.5开始,解除了这个限制,使得HAVING子句可以引用别名,而不管是否 ONLY_FULL_GROUP_BY启用。 有关其他讨论和示例,请参见 第12.19.3节“MySQL处理GROUP BY”。
  • PAD_CHAR_TO_FULL_LENGTH 默认情况下,尾部空格CHAR在检索时从列值中删除 。如果 PAD_CHAR_TO_FULL_LENGTH启用,则不会发生修剪,并将检索 CHAR值填充到其全长。此模式不适 VARCHAR用于在检索时保留尾随空格的列。 mysql> CREATE TABLE t1 (c1 CHAR(10)); Query OK, 0 rows affected (0.37 sec) mysql> INSERT INTO t1 (c1) VALUES('xy'); Query OK, 1 row affected (0.01 sec) mysql> SET sql_mode = ''; Query OK, 0 rows affected (0.00 sec) mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1; +------+-----------------+ | c1 | CHAR_LENGTH(c1) | +------+-----------------+ | xy | 2 | +------+-----------------+ 1 row in set (0.00 sec) mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'; Query OK, 0 rows affected (0.00 sec) mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1; +------------+-----------------+ | c1 | CHAR_LENGTH(c1) | +------------+-----------------+ | xy | 10 | +------------+-----------------+ 1 row in set (0.00 sec)
  • PIPES_AS_CONCAT 治疗||作为字符串并置运算符(同 CONCAT()),而不是作为一个同义词OR
  • REAL_AS_FLOAT 对待REAL作为一个代名词 FLOAT。默认情况下,MySQL REAL作为一个同义词 DOUBLE
  • STRICT_ALL_TABLES 为所有存储引擎启用严格的SQL模式。无效的数据值被拒绝。有关详细信息,请参阅 严格SQL模式。 从MySQL 5.7.4通过5.7.7, STRICT_ALL_TABLES包括的效果 ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATENO_ZERO_IN_DATE模式。有关其他讨论,请参阅 MySQL 5.7中的SQL模式更改。
  • STRICT_TRANS_TABLES 为事务性存储引擎启用严格的SQL模式,并在非事务性存储引擎可能的情况下启用。有关详细信息,请参阅严格SQL模式。 从MySQL 5.7.4通过5.7.7, STRICT_TRANS_TABLES 包括的效果 ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATENO_ZERO_IN_DATE模式。有关其他讨论,请参阅 MySQL 5.7中的SQL模式更改。

组合SQL模式

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

  • ANSI 相当于 REAL_AS_FLOATPIPES_AS_CONCATANSI_QUOTESIGNORE_SPACE,和(从MySQL 5.7.5的)ONLY_FULL_GROUP_BYANSI模式还会导致服务器返回一个查询错误,其中S具有外部引用 的集合函数 无法在外部查询所针对的外部查询集合中进行聚合。这是一个这样的问题: S(outer_ref) SELECT * FROM t1 WHERE t1.a IN (SELECT MAX(t1.b) FROM t2 WHERE ...); 在这里,MAX(t1.b)不能在外部查询中进行聚合,因为它出现在该WHERE查询的 子句中。标准SQL在这种情况下需要一个错误。如果 ANSI模式未启用,则服务器将 按照与其解释相同的方式处理 这样的查询 。 S(outer_ref)S(const) 请参阅第1.8节“MySQL标准合规性”。
  • DB2 相当于 PIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_KEY_OPTIONSNO_TABLE_OPTIONSNO_FIELD_OPTIONS
  • MAXDB 相当于 PIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_KEY_OPTIONSNO_TABLE_OPTIONSNO_FIELD_OPTIONSNO_AUTO_CREATE_USER
  • MSSQL 相当于 PIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_KEY_OPTIONSNO_TABLE_OPTIONSNO_FIELD_OPTIONS
  • MYSQL323 相当于MYSQL323HIGH_NOT_PRECEDENCE。这意味着HIGH_NOT_PRECEDENCE 加上一些SHOW CREATE TABLE 特定的行为 MYSQL323
    • TIMESTAMP列显示不包括DEFAULTON UPDATE在MySQL 4.1中引入的属性。
    • 字符串列显示不包括在MySQL 4.1中引入的字符集和整理属性。对于CHARVARCHAR列,如果核对是二进制的,BINARY被附加到列类型。
    • 该 表选项显示为 。 ENGINE=engine_nameTYPE=engine+name
    • 对于MEMORY表,存储引擎显示为HEAP
  • MYSQL40 相当于MYSQL40HIGH_NOT_PRECEDENCE。这意味着HIGH_NOT_PRECEDENCE 加上一些特定的行为 MYSQL40MYSQL323除了SHOW CREATE TABLEHEAP作为MEMORY表格的存储引擎显示之外,它们与for相同。
  • ORACLE 相当于 PIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_KEY_OPTIONSNO_TABLE_OPTIONSNO_FIELD_OPTIONSNO_AUTO_CREATE_USER
  • POSTGRESQL 相当于 PIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_KEY_OPTIONSNO_TABLE_OPTIONSNO_FIELD_OPTIONS
  • TRADITIONAL MySQL的5.7.4之前,以及在MySQL 5.7.8或更高版本, TRADITIONAL就相当于STRICT_TRANS_TABLESSTRICT_ALL_TABLESNO_ZERO_IN_DATENO_ZERO_DATEERROR_FOR_DIVISION_BY_ZERONO_AUTO_CREATE_USER,和 NO_ENGINE_SUBSTITUTION。 从MySQL 5.7.4虽然5.7.7, TRADITIONAL相当于STRICT_TRANS_TABLESSTRICT_ALL_TABLESNO_AUTO_CREATE_USER,和 NO_ENGINE_SUBSTITUTION。的NO_ZERO_IN_DATENO_ZERO_DATEERROR_FOR_DIVISION_BY_ZERO 模式没有因为在他们的影响都包括在严格的SQL模式(影响这些版本命名STRICT_ALL_TABLESSTRICT_TRANS_TABLES)。因此,TRADITIONAL所有MySQL 5.7版本的效果 都是一样的(和MySQL 5.6中一样)。有关其他讨论,请参阅 MySQL 5.7中的SQL模式更改。

严格的SQL模式

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

如果严格模式没有生效,MySQL将插入调整后的值作为无效值或缺失值,并产生警告(参见 第13.7.5.40节“SHOW WARNINGS Syntax”)。在严格模式下,您可以使用INSERT IGNORE 或生成此行为 UPDATE IGNORE

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

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

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

严格的SQL模式是有效的,如果其中一个 STRICT_ALL_TABLES或是 STRICT_TRANS_TABLES启用,虽然这些模式的影响有所不同:

  • 对于事务性表,当启用STRICT_ALL_TABLESSTRICT_TRANS_TABLES启用数据更改语句时,无效或缺少值会发生错误 。该声明被中止并回滚。
  • 对于非事务性表,如果在要插入或更新的第一行中出现错误值,则对于任一模式,行为都是相同的:语句被中止,表保持不变。如果语句插入或修改多行,并且第二行或更后一行出现错误值,则结果取决于启用了哪个严格模式:
    • 因为STRICT_ALL_TABLES,MySQL返回一个错误,并忽略其余的行。但是,由于先前的行已被插入或更新,所以结果是部分更新。为了避免这种情况,可以使用单行语句,可以在不更改表的情况下中止。
    • 因为 STRICT_TRANS_TABLES,MySQL会将无效值转换为列的最接近的有效值并插入调整后的值。如果缺少一个值,MySQL将插入列数据类型的隐式默认值。无论哪种情况,MySQL都会生成警告而不是错误,并继续处理语句。第11.7节“数据类型默认值”中介绍了隐式默认值。

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

  • 严格模式影响零除的处理,其中包括 : MOD(N,0) 对于数据更改操作(INSERTUPDATE):
    • 如果没有启用严格模式,则除以零插入 NULL并不产生警告。
    • 如果启用了严格模式,则除以零除会产生错误,除非IGNORE给出。对于INSERT IGNOREUPDATE IGNORE,除以零插入NULL并产生一个警告。

    因为SELECT,除以零回报NULL。启用严格模式也会产生警告。

  • 严格模式影响服务器是否允许 '0000-00-00'为有效日期:
    • 如果严格模式未启用, '0000-00-00'则允许插入,不会产生警告。
    • 如果启用了严格模式,'0000-00-00'则不允许插入,除非 IGNORE给出严格的模式 。为 INSERT IGNOREUPDATE IGNORE'0000-00-00'被允许和插入产生警告。
  • 严格模式会影响服务器是否允许年份不为零,但月份或日期部分为0(日期如'2010-00-01'or '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_ZERONO_ZERO_DATENO_ZERO_IN_DATE模式。从MySQL 5.7.4尽管5.7.7的ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATE以及 NO_ZERO_IN_DATE明确命名及其影响都包括在严格模式的影响时模式什么也不做。有关其他讨论,请参阅 MySQL 5.7中的SQL模式更改。

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

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

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

操作模式

当语句默认是错误

当语句默认是警告

没有IGNORE或严格的SQL模式

错误

警告

同 IGNORE

警告

警告(与没有IGNORE或严格的SQL模式相同)

采用严格的SQL模式

错误(与没有IGNORE或严格的SQL模式相同)

错误

采用IGNORE严格的SQL模式

警告

警告

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

IGNORE对语句执行的影响

MySQL中的几个语句支持一个可选的 IGNORE关键字。此关键字会导致服务器降级某些类型的错误,并生成警告。对于多行语句, IGNORE会导致语句跳到下一行而不是中止。

例如,如果表t具有主键列i,则尝试将相同的值插入i到多行中通常会产生重复键错误:

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: 1

mysql> SHOW WARNINGS;
+---------+------+---------------------------------------+
| Level   | Code | Message                               |
+---------+------+---------------------------------------+
| Warning | 1062 | Duplicate entry '1' for key 'PRIMARY' |
+---------+------+---------------------------------------+
1 row in set (0.00 sec)

这些语句支持IGNORE关键字:

  • CREATE TABLE ... SELECTIGNORE不适用于CREATE TABLESELECT声明的部分,但要插入到所生产的行的表SELECT。丢弃在唯一键值上复制现有行的行。
  • DELETEIGNORE导致MySQL在删除行的过程中忽略错误。
  • INSERT:与 IGNORE,在唯一键值上复制现有行的行将被丢弃。将设置为会导致数据转换错误的值设置为最接近的有效值。 对于未找到与给定值匹配的分区的分区表,IGNORE会导致插入操作对包含不匹配值的行进行无提示失败。
  • LOAD DATALOAD XML:With IGNORE,丢弃在唯一键值上复制现有行的行。
  • UPDATE:与 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.8节“服务器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 5.7中的SQL模式更改

在MySQL 5.7.5中, ONLY_FULL_GROUP_BY默认情况下启用SQL模式,因为GROUP BY 处理已经变得更复杂,包括检测功能依赖。但是,如果您发现已 ONLY_FULL_GROUP_BY启用导致现有应用程序的查询被拒绝,则这些操作中的任何一个都应恢复操作:

  • 如果可以修改违规查询,则可以这样做,以便非聚合列在功能上依赖于GROUP BY列,或者通过使用非聚合列引用ANY_VALUE()
  • 如果无法修改违规查询(例如,如果它是由第三方应用程序生成的),请sql_mode在服务器启动时将系统变量设置为不启用 ONLY_FULL_GROUP_BY

在MySQL 5.7.4,的 ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATENO_ZERO_IN_DATESQL模式已被弃用。从MySQL 5.7.4到5.7.7,这些模式在明确命名时不做任何事情。相反,它们的效果包含在严格SQL模式(STRICT_ALL_TABLESSTRICT_TRANS_TABLES)的效果中。换句话说,严格模式在这些版本中意味着与严格模式加上,和 ERROR_FOR_DIVISION_BY_ZERO, 之前的5.7.4含义相同的东西 。 NO_ZERO_DATENO_ZERO_IN_DATE

MySQL的5.7.4的变化,使通过包括严格的模式更加严格 ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATE以及NO_ZERO_IN_DATE引起了一些问题。例如,在具有严格模式但未NO_ZERO_DATE启用的MySQL 5.6中 , TIMESTAMP可以使用定义列DEFAULT '0000-00-00 00:00:00'。在具有相同模式设置的MySQL 5.7.4中,严格模式包含的效果NO_ZERO_DATETIMESTAMP无法定义的列DEFAULT '0000-00-00 00:00:00'。这会导致CREATE TABLE从5.6到5.7.4 的语句复制,如果它们包含这样的TIMESTAMP列,则会失败。

长期计划仍然是将三种受影响的模式纳入严格的SQL模式,并将其作为明确的模式在未来的MySQL版本中删除。但为了恢复MySQL 5.7与MySQL 5.6严格模式的兼容性,并为受影响的应用程序提供更多的时间修改,MySQL 5.7.8中进行了以下更改:

  • ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATE并且 NO_ZERO_IN_DATE在明确命名时有效。这将恢复在MySQL 5.7.4中所做的更改。
  • ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATENO_ZERO_IN_DATE不是严格的SQL模式的一部分。这将恢复在MySQL 5.7.4中所做的更改。
  • ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATENO_ZERO_IN_DATE被包括在默认 sql_mode值,其结果包括以下模式: ONLY_FULL_GROUP_BYSTRICT_TRANS_TABLESNO_ZERO_IN_DATENO_ZERO_DATEERROR_FOR_DIVISION_BY_ZERONO_AUTO_CREATE_USER,和 NO_ENGINE_SUBSTITUTION

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

虽然在MySQL 5.7.8及更高版本 ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATE,并且 NO_ZERO_IN_DATE可以与严格模式分开使用,但它们的目的是一起使用。提醒一下,如果在不启用严格模式的情况下启用警告,则会发生警告,反之亦然。

重要

以下讨论仅适用于MySQL版本5.7.4到5.7.7。对于从MySQL 5.7.4以前的版本升级,我们建议升级到MySQL 5.7.8或更高版本,这使得讨论不必要。

本节的其余部分描述了在MySQL 5.7.4到5.7.7中使用的SQL模式设置,以实现与5.7.4之前相同的语句执行,包括给出的情况INSERTUPDATE在其中的 IGNORE情况。它还提供了确定应用程序是否需要修改以在SQL模式更改之前和之后表现相同的指导原则。

下表显示了如何控制MySQL 5.7.4到5.7.7以及MySQL 5.7.4到5.7.7以外版本的除零处理。

期望的行为

MySQL 5.7.x版本除了5.7.4到5.7.7

MySQL 5.7.4到5.7.7

插入NULL,不会产生警告

ERROR_FOR_DIVISION_BY_ZERO 未启用

严格模式未启用

插入NULL,产生警告

ERROR_FOR_DIVISION_BY_ZERO,或 ERROR_FOR_DIVISION_BY_ZERO+严格模式+IGNORE

严格模式+ IGNORE

错误

ERROR_FOR_DIVISION_BY_ZERO +严格模式

严格模式

下表显示了如何控制服务器是否允许'0000-00-00'MySQL 5.7.4到5.7.7以及MySQL 5.7.4到5.7.7以外的其他版本的有效日期。

期望的行为

MySQL 5.7.x版本除了5.7.4到5.7.7

MySQL 5.7.4到5.7.7

插入'0000-00-00',不会产生警告

NO_ZERO_DATE 未启用

严格模式未启用

插入'0000-00-00',产生警告

NO_ZERO_DATE,或NO_ZERO_DATE+严格模式+IGNORE

严格模式+ IGNORE

错误

NO_ZERO_DATE +严格模式

严格模式

下表显示了如何控制服务器是否允许MySQL 5.7.4到5.7.7以外版本和MySQL 5.7.4到5.7.7版本的零部件日期。

期望的行为

MySQL 5.7.x版本除了5.7.4到5.7.7

MySQL 5.7.4到5.7.7

插入日期,不会产生警告

NO_ZERO_IN_DATE 未启用

严格模式未启用

插入'0000-00-00',产生警告

NO_ZERO_IN_DATE,或 NO_ZERO_IN_DATE+严格模式+ IGNORE

严格模式+ IGNORE

错误

NO_ZERO_IN_DATE +严格模式

严格模式

下面的讨论描述了在5.7.4到5.7.7的SQL模式变化下,给定语句产生相同或不同结果的条件。它只考虑严格模式(STRICT_ALL_TABLESSTRICT_TRANS_TABLES)和三个弃用模式(ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATE,和 NO_ZERO_IN_DATE)。其他SQL模式(如ANSI_QUOTES或) ONLY_FULL_GROUP_BY假定在升级之前和之后保持不变。

本讨论还介绍了如何准备从5.7.4以前的版本升级到5.7.4到5.7.7。 升级前应做任何修改。

对于以下SQL模式设置,MySQL 5.6和5.7之间的行为没有任何变化。在这些设置下执行的语句不需要修改就可以在5.6和5.7中产生相同的结果:

  • 严格模式和三个弃用模式都未启用。
  • 严格模式和三种弃用模式都已启用。

以下SQL模式设置会发生MySQL 5.6中的警告更改为MySQL 5.7中的警告。语句执行的结果在5.6和5.7中是相同的,因此语句不需要修改,除非警告被认为是重要的:

  • 严格模式未启用,但已弃用ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATE模式中的任一个已 启用。

在以下SQL模式设置下发生行为更改。在这些设置下执行的语句必须修改,以在5.6和5.7中产生相同的结果:

  • 严格模式未启用, NO_ZERO_IN_DATE已启用。对于这种模式设置,请在执行语句时期望这些差异:
    • 在5.6中,服务器插入零部件的日期 '0000-00-00'并产生一个警告。
    • 在5.7中,服务器按原样插入零部件的日期,并不产生警告。
  • 启用严格模式,启用三个不推荐使用的模式中的一些模式,但不是全部。对于这种模式设置,请在执行语句时期望这些差异: 通过启用不被使用的弃用模式将会影响的语句在5.7中产生错误,但在5.6中不会产生错误。假设严格模式,,NO_ZERO_DATENO_ZERO_IN_DATE被启用,并且数据更改语句执行零除:
    • 在5.6中,该语句插入NULL 并不产生警告。启用 ERROR_FOR_DIVISION_BY_ZERO 会导致一个错误,而不是。
    • 在5.7中,会出现错误,因为严格模式隐含地包含了效果 ERROR_FOR_DIVISION_BY_ZEROERROR_FOR_DIVISION_BY_ZERO 显式启用 不会改变这一点。

要准备升级到MySQL 5.7.4到5.7.7,主要原则是确保您的应用程序在MySQL 5.6和5.7中以相同的方式运行。例如,您可以采用以下任一方法来实现应用程序兼容性:

  • 修改应用程序以特定于版本的方式设置SQL模式。如果我们假设应用程序不会在5.7.4之前的开发版本的MySQL 5.7中使用,那么可以sql_mode根据当前服务器版本为应用程序设置 值,如下所示: SET sql_mode = IF(LEFT(VERSION(),3)<'5.7',5.6 mode,5.7 mode); 本节前面显示的表格可作为MySQL 5.6和5.7的相应等效模式的指南。
  • 将应用程序修改为在MySQL 5.6和5.7中语句产生相同结果的SQL模式下执行。 小费 TRADITIONALMySQL 5.6中的SQL模式包括严格模式和三种弃用模式。如果你编写的应用程序TRADITIONAL在MySQL 5.6中以模式运行 ,那么对MySQL 5.7没有任何改变。

在评估MySQL 5.6和5.7之间的SQL模式兼容性时,特别考虑这些语句执行上下文:

  • 复制。在以下情况下,您将遇到与SQL模式更改相关的复制不兼容问题:
    • MySQL 5.6主站和5.7从站
    • 基于语句的复制
    • 如前所述,SQL语句在MySQL 5.6和5.7中产生不同的结果

    要处理这种不兼容性,请使用以下解决方法之一:

    • 使用基于行的复制
    • 使用 IGNORE
    • 在MySQL 5.6和5.7中使用SQL语句不会产生不同结果的SQL模式
  • 存储的程序(存储过程和函数,触发器和事件)。每个存储的程序都使用在创建时有效的SQL模式执行。要确定在SQL模式处理中可能受到MySQL 5.6和5.7之间差异影响的存储程序,请使用以下查询: SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, SQL_MODE FROM INFORMATION_SCHEMA.ROUTINES WHERE SQL_MODE LIKE '%STRICT%' OR SQL_MODE LIKE '%DIVISION%' OR SQL_MODE LIKE '%NO_ZERO%'; SELECT TRIGGER_SCHEMA, TRIGGER_NAME, SQL_MODE FROM INFORMATION_SCHEMA.TRIGGERS WHERE SQL_MODE LIKE '%STRICT%' OR SQL_MODE LIKE '%DIVISION%' OR SQL_MODE LIKE '%NO_ZERO%'; SELECT EVENT_SCHEMA, EVENT_NAME, SQL_MODE FROM INFORMATION_SCHEMA.EVENTS WHERE SQL_MODE LIKE '%STRICT%' OR SQL_MODE LIKE '%DIVISION%' OR SQL_MODE LIKE '%NO_ZERO%';

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从外部设置传入Go变量

    前提:必须在build/run时指定 -ldflags="-X main.a=2.0 -X main.b=1" , 且a,b必须是string的变量,不能是常量...

    sunsky
  • CMake vs Make对比

    程序员现在已经使用了CMake和Make了很久。当您加入大公司或开始使用大型代码库开发项目时,您需要处理所有这些构建。你必须看到这些“CMakeLists.tx...

    sunsky
  • 冒泡排序的终极改进优化

    将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡...

    sunsky
  • im4java + imagemagic 搭建一个图片处理服务

    imagemagic + im4java 进行图片处理 利用 imagemagic 对图片进行处理,java工程中,使用im4java来操作imagemagi...

    一灰灰blog
  • 写一个函数,2 个参数,1 个字符串,1 个字节数,返回截取的字符串,要 求字符串中的中文不能出现乱码

    写一个函数,2 个参数,1 个字符串,1 个字节数,返回截取的字符串,要

    MickyInvQ
  • 如何在PP中通过添加列计算移动平均?

    逍遥之
  • 【注解驱动时代】细说@Value注解

    另外application.yml 获取方式一样,只是两种配置文件的样式不同。注意:yml文件中的冒号后面要有空格,冒号+空格=properties文件中的点....

    用户4143945
  • plsql

    PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通...

    职场亮哥
  • 关系型数据库之mysql

    “ MySQL是一个开源的关系型数据库,由瑞典MySQL AB 公司开发,目前属于Oracle 旗下产品。”

    每天学Java
  • Delphi 程序错误写法造成Oracle数据库负载异常

    作者介绍 ? 张洪涛 富士康 DBA 注意:本文涉及的问题在9i的环境中测试的,经验证,同样适用于11g. 在用Toad的SGA Trace工具监控我们的Or...

    数据和云

扫码关注云+社区

领取腾讯云代金券