Dar*_*iuM 3 mysql sql ieee-754
我使用进行了测试SELECT 0.1 + 0.2;,并使用MySQL(MariaDB)查询,它返回了正确的答案
MariaDB [(none)]> SELECT 0.1 + 0.2;
+-----------+
| 0.1 + 0.2 |
+-----------+
| 0.3 |
+-----------+
1 row in set (0.000 sec)
Run Code Online (Sandbox Code Playgroud)
浮点运算是因为大多数编程语言不准确的IEEE 754作为解释在这里。
MySQL的浮点计算如何使其返回正确答案?
我知道SQL 92是旧标准,但是我敢肯定,在较新的SQL标准版本中这不会更改。
SQL 92定义
73)第6.12款,
"<numeric value expression>":当两个操作数的数据类型相加时。减,乘或除运算符是精确数值,结果的精度由实现定义。“ *75)6.12节,
"<numeric value expression>":当算术运算符的任何一个操作数的数据类型为近似数值时,结果的精度由实现定义。“ *
现在的问题是:0.1与0.2在查询SELECT 0.1 + 0.2一个近似还是精确?
答案是:您也不知道数据库也不知道。
因此,数据库将运行为MySQL和MariaDB引擎定义的实现,将这些接缝视为DECIMAL(1,1)数据类型进行处理
为什么Nick的答案会返回正确的值或带有表定义的期望值
SQL 92也定义
隐式类型转换可以发生在表达式,提取操作
,单行选择操作,插入,删除和更新中。
可以使用CAST
运算符来指定显式类型转换。
Nick通过定义表中的数据类型来完成此工作。
编辑此答案是因为我今天在MySQL手册中找到了一些东西。
查询
SELECT (0.1 + 0.2) = 0.3
Run Code Online (Sandbox Code Playgroud)
结果存入1MySQL,这意味着MySQL使用精确的数值计算,并在可能的情况下使用Precision Math。因此,MySQL确实知道0.1,0.2并且0.3这里是精确的数据类型,需要计算精确的数据类型,就像我在此编辑之前所期望的那样。
意思查询
SELECT (0.1 + 0.2) = 0.3
Run Code Online (Sandbox Code Playgroud)
会或多或少地在引擎盖下运行
SELECT CAST((0.1 + 0.2) AS DECIMAL(1, 1)) = CAST((0.3) AS DECIMAL(1, 1));
Run Code Online (Sandbox Code Playgroud)