暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的函数和运算符 - 精确数学 - 表达式处理

林员外聊编程 2021-10-10
707
表达式处理
 
在精确数学中,尽可能使用给定的精确值。例如,在比较中使用的数字完全是给定的,值没有变化。在严格SQL模式下,对于 INSERT 具有精确数据类型(DECIMAL 或整数)的列,如果在列范围内,则插入数字的精确值。检索时,该值应与插入的值相同。(如果没有启用严格的SQL模式,则允许对 INSERT 进行截断。)
 
数值表达式的处理取决于表达式包含的值类型:
 
 如果存在任何近似值,则表达式为近似值,并使用浮点运算进行计算。
 
 如果没有近似值,则表达式只包含精确值。如果任何精确值包含小数部分(小数点后的值),则使用 DECIMAL 精确算术计算表达式,精度为65位。术语“精确”受二进制表示的限制。例如,1.0/3.0 用十进制计数法可以近似为 .333...,但不是一个确切的数字,所以 (1.0/3.0)*3.0 并不等于 1.0
 
 否则,表达式只包含整数值。表达式是精确的,使用整数算术计算,精度与 BIGINT(64) 相同。
 
如果数值表达式包含任何字符串,则将它们转换为双精度浮点值,并且表达式是近似的。
 
对数字列的插入受 SQL 模式的影响,SQL 模式由 sql_mode 系统变量控制。下面的讨论提到了严格模式(STRICT_ALL_TABLES STRICT_TRANS_TABLES 模式值选择)ERROR_FOR_DIVISION_BY_ZERO。要打开所有限制,可以简单地使用 TRADITIONAL 模式,其中包括严格模式值和 ERROR_FOR_DIVISION_BY_ZERO
 
SET sql_mode='TRADITIONAL';
复制
 
如果将数字插入到精确类型列(DECIMAL 或整数)中,则在列范围和精度范围内插入该数字的精确值。
 
如果数值的小数部分有太多的数字,就会四舍五入。即使在严格模式下,由于小数部分舍入而导致的截断也不是错误。
 
如果整数部分的数字太多,表示数值太大(超出范围),处理方法如下:
 
 如果没有启用严格模式,该值将被截断为最接近的合法值,并生成一个警告。
 
 如果启用了严格模式,则会发生溢出错误。
 
对于 DECIMAL 字面量,除了精度限制为 65 位之外,还有字面值的文本长度限制。如果值超过大约80个字符,可能会出现意想不到的结果。例如:
 
mysql> SELECT
CAST(0000000000000000000000000000000000000000000000000000000000000000000000000000000020.01 AS DECIMAL(15,2)) as val;
+------------------+
| val |
+------------------+
| 9999999999999.99 |
+------------------+
1 row in set, 2 warnings (0.00 sec)


mysql> SHOW WARNINGS;
+---------+------+----------------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------------+
| Warning | 1292 | Truncated incorrect DECIMAL value: '20' |
| Warning | 1264 | Out of range value for column 'val' at row 1 |
+---------+------+----------------------------------------------+
2 rows in set (0.00 sec)
复制
 
未检测下溢出,因此未定义下溢处理。
 
对于将字符串插入数字列,如果字符串具有非数字内容,则按如下方式处理从字符串到数字的转换:
 
 不以数字开头的字符串不能用作数字,并在严格模式下产生错误,非严格模式产生警告,包括空字符串。
 
 可以转换以数字开头的字符串,但后面的非数字部分将被截断。如果截断部分包含空格以外的任何内容,则在严格模式下会产生错误,否则会发出警告。
 
默认情况下,除以 0 会产生 NULL,但没有警告。通过适当设置 SQL 模式,可以限制除零。
 
启用 ERROR_FOR_DIVISION_BY_ZERO SQL 模式后,MySQL 以不同的方式处理除 0
 
 如果没有启用严格模式,则会出现警告。
 
 如果启用了严格模式,则禁止涉及除零的插入和更新,并发生错误。
 
换句话说,涉及执行除零的表达式的插入和更新可以被视为错误,但是除了严格模式之外,这还需要启用 ERROR_FOR_DIVISION_BY_ZERO
 
假设我们有这样的语句:
 
INSERT INTO t SET i = 1/0;
复制
 
这就是严格模式和 ERROR_FOR_DIVISION_BY_ZERO 模式的组合所发生的情况。
 
sql_mode 
结果
'' (默认)
没有警告,没有错误,i 设置为 NULL
strict
没有警告,没有错误,i 设置为 NULL
ERROR_FOR_DIVISION_BY_ZERO
警告,没有错误,i 设置为 NULL
strict,ERROR_FOR_DIVISION_BY_ZERO
错误,未插入任何行。
 
 
 
 
 
 
官方网址:
https://dev.mysql.com/doc/refman/8.0/en/precision-math-expressions.html
文章转载自林员外聊编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论