对于一个大的实数值列,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 |
+------------------------+
答案 0 :(得分:0)
好的,我认为这与SUM可以处理的数字上限有关。
例如: 插入z值(1.80309068027e307),(1.44090607633e307),(1.59586958712e307);
工作正常。
插入z值(1.80309068027e308),(1.44090607633e307),(1.59586958712e307);
不起作用,因为1.80309068027e308是非法的双倍。我猜是因为它太大了。
所以,似乎如果总结的数字都低于双重上限,但结果是高于该上限的两倍,它会报告0,而不是返回错误?