使用精确数学时,只要有可能,就会按原样使用精确值数字。例如,比较中的数字将完全按给定值使用,而不会更改值。在严格 SQL 模式下,对于将 INSERT
插入到具有精确数据类型(DECIMAL
或整数)的列中,如果数字在其列范围内,则将使用其精确值插入。检索时,该值应与插入的值相同。(如果未启用严格 SQL 模式,则允许对 INSERT
进行截断。)
数值表达式的处理取决于表达式包含的值类型
如果数值表达式包含任何字符串,则它们将转换为双精度浮点值,并且该表达式为近似表达式。
插入到数值列的操作受 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 值 |
结果 |
---|---|
'' (默认值) |
无警告,无错误;i 被设置为 NULL 。 |
严格 | 无警告,无错误;i 被设置为 NULL 。 |
ERROR_FOR_DIVISION_BY_ZERO |
警告,无错误;i 被设置为 NULL 。 |
严格,ERROR_FOR_DIVISION_BY_ZERO |
错误情况;未插入任何行。 |