我有一个PHP脚本在MySQL数据库中插入行。每行都有一个字段'created_at',它填充了PHP函数microtime(true)的值,并作为double插入。 (microtime因为我需要的东西比第二种更精确)
我有另一个PHP脚本,它根据created_at字段选择行。
当我继续选择这样的时候:
SELECT * FROM `ms_voltage` WHERE created_at > 1302775523.51878
我收到一个结果集,第一行是created_at的完全正确值的行。
当我手动执行查询时,从我的PHP脚本和PhpMyAdmin中发生这种情况。但并不总是,不是每一个价值。只是偶尔一次。
这怎么可能?我没有要求大于/等于,我要严格要大于。 我可能会忽略与类型有关的事情吗?
答案 0 :(得分:4)
DOUBLE类型仅表示近似数值数据值。尝试使用DECIMAL类型。
答案 1 :(得分:4)
是的,浮点运算有时可以做到这一点。为了理解原因,有必要认识到,并非所有数字都能在基数10中准确表示,并非所有数字都可以在基数2中准确表示。
例如,“1/3”可以在基数10中写为0.33333或0.33334。两者都不是真的“正确”;他们是我们能做的最好的事情。基数10中的“DOUBLE”可能是0.3333333333或0.3333333334,这是数字的两倍,但仍然不是“正确”。
最佳选择是使用DECIMAL 值,或使用INT 值(并将实际值乘以,比如10000或100000以获得您关心的小数位数。)
答案 2 :(得分:2)
你的列是浮点数吗?使用true调用microtime会给你一个浮点数,看起来像一个浮点数,它会在你看不到的.51878之后有数字,所以那些数字会使存储的值大于查询中的值。
除非你真的需要浮点数,否则我会将字符串结果转换为int,甚至两列for seconds和useconds。然后你可以使用>或者<在已知值上,不必担心浮点值的不精确性。