REAL类型的MySQL SUM可以返回不一致的结果

时间:2014-12-04 19:33:08

标签: mysql sql rdbms addition

对于一个大的实数值列,MySQL将为其总和返回0,但如果包含在子选择中,则将返回非零结果。我知道通常溢出的情况是未定义的,但我觉得MySQL会返回不同的结果,这取决于查询是简单还是包含子选择。

create table z (f_real real);
insert into z values (1.80309068027e307),(1.44090607633e308),(1.59586958712e308);
select sum(f_real) from z;
+-------------+
| sum(f_real) |
+-------------+
|           0 |
+-------------+
select * from (select sum(f_real) from z) t;
+------------------------+
| sum(f_real)            |
+------------------------+
| 1.7976931348623157e308 |
+------------------------+

1 个答案:

答案 0 :(得分:0)

好的,我认为这与SUM可以处理的数字上限有关。

例如: 插入z值(1.80309068027e307),(1.44090607633e307),(1.59586958712e307);

工作正常。

插入z值(1.80309068027e308),(1.44090607633e307),(1.59586958712e307);

不起作用,因为1.80309068027e308是非法的双倍。我猜是因为它太大了。

所以,似乎如果总结的数字都低于双重上限,但结果是高于该上限的两倍,它会报告0,而不是返回错误?