php - Mysql 选择查询错误 '7.56'

标签 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 运行此查询时会得到相同的结果。如果有人发现明显的错误,请告诉我!

最佳答案

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

因此,您的 7.56 表示为 7.55999999999 - 例如,无法通过严格比较作为 float 找到,但可以通过作为字符串比较找到。参见'float comparison'部分了解更多信息。

为了解决这个问题 - 通常的解决方案是涉及精度增量并将值与

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

-这里 1E-12 是那个增量。

关于php - Mysql 选择查询错误 '7.56',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18869988/

相关文章:

sql - 公共(public)列名称不同但两个表中信息相同时如何连接两个sql表

php - 如何创建数字调查 android 应用程序和 php(服务器)?

PHP CRON 电子邮件发送 CPU 密集型

php - 如何在vtiger crm中添加州名称下拉框

python - 根据主表一列spark.sql验证两列中的数据

mysql - 如何使用 TSQl 从文件夹读取文件并将文件名保存到表中?

php - php mysql 一列上的多个选择语句

php - 在提交表单时重定向到推荐人

mysql - 在 MySQL 中,我如何知道特定表正在使用什么字符集?

SQL查询以获得满足条件的直接父级