mysql选择查询错误'7.56'

时间:2013-09-18 10:38:38

标签: php mysql sql

这似乎是一个非常奇怪的问题,我似乎无法找到原因的底部。当运行mysql select语句时,我们不会返回任何结果,但只有当值达到引用的“7.56”时才会返回。如果我们运行没有引号的相同查询或使用不同的数字,它按预期工作。示例查询和结果如下:

SELECT * 
FROM  `orders` 
WHERE  `itemsTotal` =  '7.56'
LIMIT 0 , 30

MySQL返回一个空结果集(即零行)。 (查询花了0.0334秒)

SELECT * 
FROM  `orders` 
WHERE  `itemsTotal` = 7.56
LIMIT 0 , 30

Showing rows 0 - 0 ( 1 total, Query took 0.0297 sec)

现在,如果您将项目总数更改为7.57:

SELECT * 
FROM  `orders` 
WHERE  `itemsTotal` =  '7.57'
LIMIT 0 , 30

Showing rows 0 - 0 ( 1 total, Query took 0.0280 sec)

SELECT * 
FROM  `orders` 
WHERE  `itemsTotal` = 7.57
LIMIT 0 , 30

Showing rows 0 - 0 ( 1 total, Query took 0.0284 sec)

这是运行mysql 5.5.24,用于在实时环境中测试本地主机和mysql 5.0.95。从PHP文件和phpmyadmin运行此查询时的结果相同。如果有人能发现明显的错误,请告诉我!

1 个答案:

答案 0 :(得分:4)

您的比较问题是float precision。由于浮点数据类型近似代表值,因此在常见情况下不能依赖严格的比较。这就是为什么你可以得到结果是你直接将你的值转换为字符串,但是如果你试图比较浮点数则不行。

因此,您的7.56表示为7.55999999999例如 - 并且无法通过严格比较找到浮点数,但可以通过比较作为字符串找到。有关详细信息,请参阅'float comparison'部分。

要解决这个问题 - 通常的解决方案是使用精确增量并将值与

进行比较
SELECT * 
FROM  `orders` 
WHERE  ABS(`itemsTotal` - 7.56) < 1E-12
LIMIT 0 , 30

-here 1E-12就是那个delta。