Mysql为什么12.3< 12.3是真的

时间:2015-05-13 17:32:12

标签: mysql

我有一张桌子

-------OT-----------
- id        - INT  -
- from_time - FLOAT-
- to_time   - FLOAT-
--------------------

保存价值

- id - from_time -- to_time --
-------------------------
- 1  - 8.3       -- 12.3    --
-------------------------

我的SQL查询

SELECT * FROM (`OT` as wt) WHERE ( (12.3 < wt.to_time) );

预计它不会返回任何记录。 但它实际上返回了记录id = 1。

我尝试过0.3到15.3并且它是相同的但是16.6它没有返回记录。 我的MySQL版本是5.6.23。

请帮助我,为什么会这样?

2 个答案:

答案 0 :(得分:6)

浮点精度不是精确的科学。您应该使用DECIMAL数据类型而不是FLOAT

参考:https://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html

答案 1 :(得分:1)

@tuananh是绝对正确的。

因此,您可以更改列的类型或更改查询:

SELECT * FROM (`OT` as wt) WHERE ( 12.3  < CAST(wt.to_time AS DECIMAL(15,4)) );

http://sqlfiddle.com/#!9/01434/5

但是,更改列类型以简化将来的使用并提高您将创建的查询的性能会更好。如果你使用大量CAST,它将减慢查询执行时间。