使用精度数学时, exact-value 数字将尽可能地使用其原始值。例如,在比较中,数字将被精确地使用,不会改变其值。在严格的 SQL 模式下,对于插入到精确数据类型(DECIMAL
或整数)列的插入,数字将以其精确值插入,如果它在列范围内。当检索时,值应该与插入时相同。(如果严格的 SQL 模式未启用,插入时允许截断。)
数字表达式的处理取决于表达式中包含的值类型:
如果数字表达式包含任何字符串,它们将被转换为双精度浮点值,并且表达式是近似的。
插入到数字列的操作受到 SQL 模式的影响,该模式由 sql_mode
系统变量控制。(见 第 7.1.11 节,“服务器 SQL 模式”。)以下讨论提到严格模式(由 STRICT_ALL_TABLES
或 STRICT_TRANS_TABLES
模式值启用)和 ERROR_FOR_DIVISION_BY_ZERO
。要启用所有限制,可以简单地使用 TRADITIONAL
模式,该模式包括严格模式值和 ERROR_FOR_DIVISION_BY_ZERO
:
SET sql_mode='TRADITIONAL';
如果将数字插入到精确类型列(DECIMAL
或整数)中,它将以其精确值插入,如果它在列范围内并且精度内。
如果值的小数部分有太多数字,会发生舍入,并生成一条注意信息。舍入按照 第 14.24.4 节,“舍入行为” 中描述的方式进行。小数部分的截断不是错误,即使在严格模式下。
如果值的整数部分有太多数字,它太大(超出范围)并且按照以下方式处理:
-
如果严格模式未启用,值将被截断到最近的合法值,并生成一条警告。
-
如果严格模式启用,会发生溢出错误。
下溢未被检测,因此下溢处理未定义。
对于字符串插入到数字列的操作,如果字符串包含非数字内容:
-
不以数字开头的字符串不能用作数字,并在严格模式下产生错误,否则产生警告。这包括空字符串。
-
以数字开头的字符串可以被转换,但尾随的非数字部分将被截断。如果截断的部分包含任何内容而不是空格,这将在严格模式下产生错误,否则产生警告。
默认情况下,除以零将产生 NULL 结果,不会生成警告。通过设置 SQL 模式,可以限制除以零。
启用 ERROR_FOR_DIVISION_BY_ZERO
SQL 模式后,MySQL 将以不同的方式处理除以零:
-
如果不启用严格模式,会出现警告。
-
如果启用严格模式,涉及除以零的插入和更新操作将被禁止,并出现错误。
换言之,涉及除以零的表达式的插入和更新操作可以被视为错误,但这需要在严格模式下启用ERROR_FOR_DIVISION_BY_ZERO
。
假设我们有以下语句:
INSERT INTO t SET i = 1/0;
以下是严格模式和ERROR_FOR_DIVISION_BY_ZERO
模式的组合结果。
sql_mode Value |
Result |
---|---|
'' (默认) |
无警告,无错误;i 被设置为 NULL 。 |
严格 | 无警告,无错误;i 被设置为 NULL 。 |
ERROR_FOR_DIVISION_BY_ZERO |
警告,无错误;i 被设置为 NULL 。 |
严格,ERROR_FOR_DIVISION_BY_ZERO |
错误条件;没有行被插入。 |