转载

你知道FLOAT类型不能用等值查询吗

今天听到一个说法,说float类型不能用等值查询,用等值查询你是查不到结果的。之前我可是完全不知道这么个结论啊。。作为DBA一枚,怎么能道听途说呢,万一别人胡说八道呢。我得先验证下这个小道消息对不对。。

场景重现

root@127.0.0.1 : wing 11:57:45> create table t(id float);
Query OK, 0 rows affected (0.51 sec)

root@127.0.0.1 : wing 12:01:29> insert into t values(1.1);
Query OK, 1 row affected (0.28 sec)

root@127.0.0.1 : wing 12:01:38> select * from t;
+------+
| id |
+------+
| 1.1 |
+------+
1 row in set (0.00 sec)

# 哎呀呀,明明有1.1这个记录,为什么就是查不到哇
root@127.0.0.1 : wing 12:01:41> select * from t where id=1.1;
Empty set (0.00 sec)

# 试试这个方法
root@127.0.0.1 : wing 12:01:47> select * from t where id>1;
+------+
| id |
+------+
| 1.1 |
+------+
1 row in set (0.00 sec)

# 再试试这个方法
root@127.0.0.1 : wing 12:02:18> select * from t where id<2;
+------+
| id |
+------+
| 1.1 |
+------+
1 row in set (0.00 sec)

# 这个方法查不到倒是符合预期的
root@127.0.0.1 : wing 12:07:09> select * from t where id=1
-> ;
Empty set (0.00 sec)

原理

通过实验验证,好像别人真的不是胡说八道呢。可是为什FLOAT类型不能等值查询呢,即浮点数为什么不能等号比较呢?。。

人就怕认真(我在自夸,你感受到了咩。。)

通过科学上网,我找到了原因。。

float在存储时是以近似值的方式存储的,所以不能使用等值查询。

原文  http://wing324.github.io/2016/05/15/你知道浮点数不能用等值查询吗/
正文到此结束
Loading...