问题
之前在用 mysql 查询有 float 字段的时候,比如某一个字段 fee,明明有一条是 fee 为 1.99 的记录,但是就是查不到??

select * from fee_mode where is_pp_recurring = 1 and is_enable = 1 and fee = 1.99

在这里插入图片描述

后面查了一下,发现原来查询 float 字段是有坑的:
原来在 MYSQL 中,字段类型为 float 的字段,如果不指定 float 的长度和小数点位数,要根据 float 字段的值精确查找,结果会是空,原因是在 mysql 中,float是浮点数,Mysql存储的时候是近似值,所以用精确查找无法匹配;但可以用like去匹配。

一、解决方法

  1. 修改为 double 类型

将float 改为 double 类型,不会出现这种问题,但是如果数据库中数据量庞大,或者修改量太大,则不适合这个方法.这个方法只适合设计数据库的初期阶段。
原因是这样的:10.28,这样的浮点值在电脑存放为 10.27999973297119140625 这种形式,同时务必注意:修改表字段类型,需要在当前表中无数据的时候修改,如果有数据的话,那已有浮点数据将会出现很多小数点。

  1. 设置float的精度

如果提前知道要查询的 float 字段的值的精度的话,只要设置float的精度然后进行查询也是可以的,比如本例中,1.99 就是两个精度,那么就可以这样查询:

select * from fee_mode where format(fee,2) = format(1.99,2);

这样也是可以的。

  1. 使用concat函数

使用了concat函数,将浮点数用空字符串连接起来,转换成字符串来进行查询:

select * from fee_mode where is_pp_recurring = 1 and is_enable = 1 AND concat(fee, '') = '1.99'

在这里插入图片描述
文章转自

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐