Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Expression Handling

14.24.3 表达式处理

使用精度数学时, exact-value 数字将尽可能地使用其原始值。例如,在比较中,数字将被精确地使用,不会改变其值。在严格的 SQL 模式下,对于插入到精确数据类型(DECIMAL 或整数)列的插入,数字将以其精确值插入,如果它在列范围内。当检索时,值应该与插入时相同。(如果严格的 SQL 模式未启用,插入时允许截断。)

数字表达式的处理取决于表达式中包含的值类型:

  • 如果表达式中存在近似值,则表达式是近似的,并使用浮点算术进行计算。

  • 如果表达式中不包含近似值,则表达式仅包含精确值。如果精确值包含小数部分(小数点后的值),则表达式将使用 DECIMAL 精确算术进行计算,精度为 65 位。术语 精确 受到二进制表示的限制。例如,1.0/3.0 可以近似地表示为 .333...,但不能写成精确数字,因此 (1.0/3.0)*3.0 不等于精确的 1.0

  • 否则,表达式仅包含整数值。表达式是精确的,并使用整数算术进行计算,精度与 BIGINT 相同(64 位)。

如果数字表达式包含任何字符串,它们将被转换为双精度浮点值,并且表达式是近似的。

插入到数字列的操作受到 SQL 模式的影响,该模式由 sql_mode 系统变量控制。(见 第 7.1.11 节,“服务器 SQL 模式”。)以下讨论提到严格模式(由 STRICT_ALL_TABLESSTRICT_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 错误条件;没有行被插入。