这似乎是一个非常奇怪的问题,我似乎无法找到原因的底部。当运行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运行此查询时的结果相同。如果有人能发现明显的错误,请告诉我!
答案 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。