MySql中float类型的字段的查询

摘要:
在MYSQL中,如果未为FLOAT类型的字段指定FLOAT的长度和小数位数,则应根据FLOAT字段的值进行精确搜索,结果将为空。这也是初学者经常犯的错误。同样,具有长度和精度集的十进制类型的c4字段也可以精确查询。

在MYSQL中,字段类型为FLOAT的字段,如果不指定FLOAT的长度和小数点位数,要根据FLOAT字段的值精确查找,结果会是空,这也是初学者经常会犯的一个错误。我们下来看一些例子:

CREATE TABLE `NewTable` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`c1` float(3,2) NOT NULL ,
`c2` float NOT NULL ,
`c3` decimal(10,0) NOT NULL ,
`c4` decimal(3,2) NOT NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=7
ROW_FORMAT=COMPACT
;
c2、c3字段都是没有设置长度、精度,采用默认值。(decimal默认长度是10,精度是0)然后,插入一些数据(0.92、1.1、1、0.01、0):

注意:c3字段类型是decimal,由于默认精度是0,所以插入的数据都转成了整型。

最后,我们测试一下查询。

1、c1、c4字段查询:

mysql> select * from test where c1=0.92;
+----+------+------+----+------+
| id | c1 | c2 | c3 | c4 |
+----+------+------+----+------+
| 1 | 0.92 | 0.92 | 1 | 0.92 |
+----+------+------+----+------+
1 row in set

mysql> select * from test where c1=1.1;
+----+-----+-----+----+-----+
| id | c1 | c2 | c3 | c4 |
+----+-----+-----+----+-----+
| 2 | 1.1 | 1.1 | 1 | 1.1 |
+----+-----+-----+----+-----+
1 row in set

mysql> select * from test where c1=1;
+----+----+----+----+----+
| id | c1 | c2 | c3 | c4 |
+----+----+----+----+----+
| 3 | 1 | 1 | 1 | 1 |
+----+----+----+----+----+
1 row in set

mysql> select * from test where c1=0.01;
+----+------+------+----+------+
| id | c1 | c2 | c3 | c4 |
+----+------+------+----+------+
| 4 | 0.01 | 0.01 | 0 | 0.01 |
+----+------+------+----+------+
1 row in set

mysql> select * from test where c1=0;
+----+----+----+----+----+
| id | c1 | c2 | c3 | c4 |
+----+----+----+----+----+
| 5 | 0 | 0 | 0 | 0 |
+----+----+----+----+----+
1 row in set
c1字段是设置了长度、精度的float类型,所以可以精确查询。同样,对于设置了长度、精度的decimal类型的c4字段,也是可以精确查询的。

2、c2字段查询:

mysql> select * from test where c2=0.92;
Empty set

mysql> select * from test where c2=1.1;
Empty set

mysql> select * from test where c2=1;
+----+----+----+----+----+
| id | c1 | c2 | c3 | c4 |
+----+----+----+----+----+
| 3 | 1 | 1 | 1 | 1 |
+----+----+----+----+----+
1 row in set

mysql> select * from test where c2=0.01;
Empty set

mysql> select * from test where c2=0;
+----+----+----+----+----+
| id | c1 | c2 | c3 | c4 |
+----+----+----+----+----+
| 5 | 0 | 0 | 0 | 0 |
+----+----+----+----+----+
1 row in set
c2是没有设置精度的float字段,除了1、0之外,对于小数无法精确查询,原因是在 mysql 中float是浮点数,存储的时候是近似值,所以用精确查找无法匹配;但可以用like去匹配,也可以使用format、concat函数去查询。

1)使用format函数:

mysql> select * from test where format(c2,2)=0.92;
+----+------+------+----+------+
| id | c1 | c2 | c3 | c4 |
+----+------+------+----+------+
| 1 | 0.92 | 0.92 | 1 | 0.92 |
+----+------+------+----+------+
1 row in set

mysql> select * from test where format(c2,2)=0.01;
+----+------+------+----+------+
| id | c1 | c2 | c3 | c4 |
+----+------+------+----+------+
| 4 | 0.01 | 0.01 | 0 | 0.01 |
+----+------+------+----+------+
1 row in set

mysql> select * from test where format(c2,1)=1.1;
+----+-----+-----+----+-----+
| id | c1 | c2 | c3 | c4 |
+----+-----+-----+----+-----+
| 2 | 1.1 | 1.1 | 1 | 1.1 |
+----+-----+-----+----+-----+
1 row in set

mysql> select * from test where format(c2,2)=1.1;
+----+-----+-----+----+-----+
| id | c1 | c2 | c3 | c4 |
+----+-----+-----+----+-----+
| 2 | 1.1 | 1.1 | 1 | 1.1 |
+----+-----+-----+----+-----+
1 row in set

mysql> select * from test where format(c2,1)=0.01;
Empty set
这里我们可以得知,format函数第二个参数,可以大于小数点后面尾数,但是小于小数点后面尾数,也是查不出来的。

2)使用concat函数:

mysql> select * from test where concat(c2,'')='0.01';
+----+------+------+----+------+
| id | c1 | c2 | c3 | c4 |
+----+------+------+----+------+
| 4 | 0.01 | 0.01 | 0 | 0.01 |
+----+------+------+----+------+
1 row in set

mysql> select * from test where concat(c2,'')='0.92';
+----+------+------+----+------+
| id | c1 | c2 | c3 | c4 |
+----+------+------+----+------+
| 1 | 0.92 | 0.92 | 1 | 0.92 |
+----+------+------+----+------+
1 row in set

mysql> select * from test where concat(c2,'')='1.1';
+----+-----+-----+----+-----+
| id | c1 | c2 | c3 | c4 |
+----+-----+-----+----+-----+
| 2 | 1.1 | 1.1 | 1 | 1.1 |
+----+-----+-----+----+-----+
1 row in set
通过concat函数将小数转成了字符串,可以做到精确查询。
————————————————
版权声明:本文为CSDN博主「赶路人儿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liuxiao723846/article/details/108119800

免责声明:文章转载自《MySql中float类型的字段的查询》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CenterNet算法笔记(目标检测论文)WPF实现消息提醒(广告弹窗)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql由于权限问题看不到用户数据库

[root@localhost ~]# mysqlWelcome to the MySQL monitor. Commands end with ; or g.Your MySQL connection id is 7Server version: 5.0.77 Source distributionType 'help;' or 'h' for help...

SQL Sever 2008性能分析之执行计划

一直想找一些关于SQL语句性能调试的权威参考,但是有参考未必就能够做好调试 2的工作。我深信实践中得到的经验是最珍贵的,书本知识只是一个引导。本篇来源于《Inside Microsoft SQL Server 2008》,有经验的高手尽管拍砖把。 这个部分将讲解一些性能分析工具,这些性能分许主要关注在执行计划。 缓存执行计划 SQL Server 2008...

.NET连接MySQL数据库的方法实现

突然对.NET连接MySQL数据库有点兴趣,于是乎网上到处找资料,学习MySQL的安装,MySQL的使用等等等等,终于搞定了! 最终效果就是显示数据库中数据表的数据: 首先,当然要有MySQL数据库啦,MySQL下载地址:www.mysql.com/downloads/ ,我下载的是最新版本的MySQL。 安装方法可以参考这篇文章:5.6版本MySQL的...

解决 Visual Studio For Mac 还原包失败问题

体验了一把改名部最新的杰作,总体感觉挺好,也能看出微软在跨平台这方面所做出的努力。 可能是预览版的缘故,还是遇到一个比较大的问题,创建netcore项目后,依赖包还原失败,错误信息如下: 可以先试着手动还原一下(说不定就成功了呢,反正我没成功) dotnet restore 如果不成功,那就按照我的做法一步一步来。 1.查看 dotnetcore sdk...

mysql max_allowed_packet过小导致的prepare失败

最近公司一台阿里云上模拟环境突然好好地就出错了额,总提示:"Unknown prepared statement handler (stmt) given to DEALLOCATE PREPARE",原以为是sql语法所致,确定没有问题后,最后确定是因为prepare对应的会话变量为null所知,mysql的max_allowed_packet被篡改为1...

Linux命令之rm

rm [选项] … 文件 … 说明:删除(unlink)文件 (1).选项 -f,--force 强制删除。忽略不存在的文件,不提示确认 -i 在删除前需要确认 -I 在删除超过三个文件或递归删除前要求确认。此选项比-i提示内容跟梢,但同样可以阻止大多数错误发生 --interactive[=WHEN] 根据指定的WHEN进行确认提示:never,once...