对于具有较大实数值的列,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 |
+------------------------+发布于 2014-12-11 09:30:00
好的,我认为这与SUM所能处理的数字达到上限有关。
例如:插入z值(1.80309068027e307)、(1.44090607633e307)、(1.59586958712e307);
工作正常。
插入z值(1.80309068027e308)、(1.44090607633e307)、(1.59586958712e307);
不起作用,因为1.80309068027e308是非法的双精度。我猜是因为它太大了。
所以,似乎如果你把所有低于双倍上限的数字相加,但结果是高于该上限的两倍,那么它将报告0,而不是返回错误?
https://stackoverflow.com/questions/27302455
复制相似问题