MySQL - BETWEEN运算符与FLOAT(10,6)的作用类似于>和<,而不是> =和< =

时间:2012-07-30 21:19:38

标签: mysql

我有一张有经纬度和经度的桌子。我成功地使用了BETWEEN子句,直到我遇到了搜索的值与数据库中的值相同的情况。在这些情况下,它不会返回结果。这是一个例子,其中:

SELECT 
  `Location`.`latitude`,
  `Location`.`longitude`
FROM
  `locations` AS `Location` 
WHERE `latitude` >= 40.735619 
  AND `latitude` <= 40.736561 
  AND `longitude` >= -74.033882 
  AND `longitude` <= -74.030861;

返回:

"latitude"  "longitude"
"40.736561" "-74.033882"
"40.735619" "-74.030861"

如果我使用BETWEEN CLAUSE(注意我甚至试过this):

SELECT   
  `Location`.`latitude`,
  `Location`.`longitude`
FROM
  `locations` AS `Location` 
WHERE `latitude` BETWEEN LEAST(40.735619, 40.736561)
  AND GREATEST(40.736561, 40.735619)
  AND `longitude` BETWEEN LEAST(- 74.033882, - 74.030861)
  AND GREATEST(- 74.030861, - 74.033882)

我得到0结果。哦,如果我为每个值Ex添加和/或减去0.000001,那么更多。 “BETWEEN(40.735619-0.00001)”等。如果我这样做,它会返回两个结果。

很好,我会使用&gt; =和&lt; =但我不明白为什么BETWEEN表现得像&gt;和&lt;在docs时非常清楚:

  

如果expr大于或等于min且expr小于或等于max,则BETWEEN返回1

2 个答案:

答案 0 :(得分:6)

您应该使用十进制数据类型而不是浮点数。浮点值之间的相等性因此是不精确的

答案 1 :(得分:1)

我怀疑这与浮点转换中的舍入错误有关。根据{{​​3}},只有当所有三个参数都是相同类型时,表达式expr BETWEEN min AND max才等同于(expr <= max AND expr >= min)。否则,类型转换将应用于所有参数。在此转换期间,将发生舍入错误。