【问题标题】:MySQL double type comparation failsMySQL双重类型比较失败
【发布时间】:2012-02-29 17:17:42
【问题描述】:

我正在使用 JavaScript 和 php+mysql 开发一个聊天模块,并将聊天数据存储到一个简单的表中:id, member1, member2, message, timestamptimestamp 列是 double(14,4),我将时间戳存储在微秒级别,例如: 1330522898.3137;

我的问题是: 当我将此时间戳与另一个时间戳进行比较时,例如

   SELECT * FROM chat_rows WHERE timestamp >= 1330535168.9548

仅在特定数字上,例如上面的这个数字,我使用运算符 >= 得到 0 行,尽管我有一行具有完全相同的值;由运算符= 区分的几乎相同的查询证明了这一点:

   SELECT * FROM chat_rows WHERE timestamp = 1330535168.9548

返回一行;

解决方法是用 varchar 替换 double(14,4) 类型,但比 double 慢;

也仅在此服务器上失败(我的开发服务器): Apache/2.2.20 (Ubuntu) MySQL客户端版本:5.1.58

在我的本地似乎可行; - 这是窗户 Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/0.9.8o Versiunea clientului MySQL: mysqlnd 5.0.8-dev - 20102224 - $Revision: 318113 $

有什么想法吗?

提前致谢!

【问题讨论】:

  • 你不能用decimal(14,4)吗?
  • 如果将其转换为字符串,然后比较字符串,它应该可以工作。问题是 14,4 是显示大小,但值和比较超出了这个范围。另一种方法是使用小数。
  • 感谢您的帮助,确实有效;我仍然不明白为什么会发生这种情况,如果我存储了 14,4 个双精度值并且我正在与相同的数字进行比较,那么为什么要超出比较范围?

标签: mysql


【解决方案1】:

进行浮点数比较的正确方法是首先确定数字之间差异的可接受容差,然后与容差值进行比较。

MySQL floating point comparison issues

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-11
    • 2012-10-09
    • 1970-01-01
    • 2011-08-02
    • 2019-01-10
    • 2013-07-02
    • 2017-11-26
    • 1970-01-01
    相关资源
    最近更新 更多