【问题标题】:MySQL request return results when call from console, but empty when request using ActiveRecordMySQL 请求从控制台调用时返回结果,但使用 ActiveRecord 请求时为空
【发布时间】:2015-04-16 08:47:59
【问题描述】:

我有一个奇怪的问题。我正在使用 Yii2(最新稳定版)。 我的桌子上有一些用于钻石底座的过滤器。过滤器 r 浮动(权重)之一。

当我尝试从 1.1 过滤到 1.2 时 - 我看到来自活动记录的数组结果。当我尝试请求 1.1 到 1.1(精确重量)时,yii 返回空数组。

我尝试从调试工具栏复制请求,在mysql控制台中执行它,mysql正确返回所有结果。

请求:

SELECT `Diamonds`.* FROM `Diamonds` 
    LEFT JOIN `DiamondsSpecialGroups` 
        ON `Diamonds`.`specialGroup` = `DiamondsSpecialGroups`.`id` 
        WHERE (((((`endPrice` >= 500) 
        AND (`type` IN (0, 1, 2, 3))) AND ((`active`=1) 
        AND (`internalBlock`=0) 
        AND (`frontendHide`=0))) 
        AND (`Weight`=0.39)) 
        AND (`endPrice` >= '500')) 
        AND (`endPrice` <= '1323231') 
    ORDER BY `endPrice` 
    LIMIT 50

如果我删除

(`Weight`=0.39)

所有结果都在 mysql 和 yii 中播种。

最后一个问题 - 为什么?

【问题讨论】:

  • = 和浮动是相当困难的。浮点数永远不会 100% 准确我认为问题可能是从 ruby​​ 到 mysql 的转换可能会稍微改变您的 0.39 的值。
  • 这是关于这个问题的更详细的答案。 stackoverflow.com/questions/2567434/…
  • 谢谢!将 FLOAT 更改为 DECIMAL 后,一切似乎都很好!
  • @Albin 您应该将其作为答案发布。

标签: mysql activerecord yii2


【解决方案1】:

= 和浮动是相当困难的。

浮点数永远不会 100% 准确,我认为问题可能在于 0.39 的两个不同实例彼此之间略有不同。

为了避免这种情况,您可以按照我在下面发布的答案中的建议使用 DECIMAL 而不是 FLOAT。

More elaborate answer.

【讨论】:

  • 很好,但它与 Ruby 有什么关系?
  • 我认为它适用于所有语言。您应该避免使用等于浮动。
  • 是的,但我认为最好从答案中删除 Ruby 提及。
  • 好点。我根据您的建议更新了答案。
猜你喜欢
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
相关资源
最近更新 更多