MySql中float类型的字段的查询

小鱼儿 2021-05-12 11:50 608阅读 0赞

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

  1. CREATE TABLE `NewTable` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT ,
  3. `c1` float(3,2) NOT NULL ,
  4. `c2` float NOT NULL ,
  5. `c3` decimal(10,0) NOT NULL ,
  6. `c4` decimal(3,2) NOT NULL ,
  7. PRIMARY KEY (`id`)
  8. )
  9. ENGINE=InnoDB
  10. DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
  11. AUTO_INCREMENT=7
  12. ROW_FORMAT=COMPACT
  13. ;

c2、c3字段都是没有设置长度、精度,采用默认值。(decimal默认长度是10,精度是0)然后,插入一些数据(0.92、1.1、1、0.01、0):

20200820112111810.png

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

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

1、c1、c4字段查询:

  1. mysql> select * from test where c1=0.92;
  2. +----+------+------+----+------+
  3. | id | c1 | c2 | c3 | c4 |
  4. +----+------+------+----+------+
  5. | 1 | 0.92 | 0.92 | 1 | 0.92 |
  6. +----+------+------+----+------+
  7. 1 row in set
  8. mysql> select * from test where c1=1.1;
  9. +----+-----+-----+----+-----+
  10. | id | c1 | c2 | c3 | c4 |
  11. +----+-----+-----+----+-----+
  12. | 2 | 1.1 | 1.1 | 1 | 1.1 |
  13. +----+-----+-----+----+-----+
  14. 1 row in set
  15. mysql> select * from test where c1=1;
  16. +----+----+----+----+----+
  17. | id | c1 | c2 | c3 | c4 |
  18. +----+----+----+----+----+
  19. | 3 | 1 | 1 | 1 | 1 |
  20. +----+----+----+----+----+
  21. 1 row in set
  22. mysql> select * from test where c1=0.01;
  23. +----+------+------+----+------+
  24. | id | c1 | c2 | c3 | c4 |
  25. +----+------+------+----+------+
  26. | 4 | 0.01 | 0.01 | 0 | 0.01 |
  27. +----+------+------+----+------+
  28. 1 row in set
  29. mysql> select * from test where c1=0;
  30. +----+----+----+----+----+
  31. | id | c1 | c2 | c3 | c4 |
  32. +----+----+----+----+----+
  33. | 5 | 0 | 0 | 0 | 0 |
  34. +----+----+----+----+----+
  35. 1 row in set

c1字段是设置了长度、精度的float类型,所以可以精确查询。同样,对于设置了长度、精度的decimal类型的c4字段,也是可以精确查询的。

2、c2字段查询:

  1. mysql> select * from test where c2=0.92;
  2. Empty set
  3. mysql> select * from test where c2=1.1;
  4. Empty set
  5. mysql> select * from test where c2=1;
  6. +----+----+----+----+----+
  7. | id | c1 | c2 | c3 | c4 |
  8. +----+----+----+----+----+
  9. | 3 | 1 | 1 | 1 | 1 |
  10. +----+----+----+----+----+
  11. 1 row in set
  12. mysql> select * from test where c2=0.01;
  13. Empty set
  14. mysql> select * from test where c2=0;
  15. +----+----+----+----+----+
  16. | id | c1 | c2 | c3 | c4 |
  17. +----+----+----+----+----+
  18. | 5 | 0 | 0 | 0 | 0 |
  19. +----+----+----+----+----+
  20. 1 row in set

c2是没有设置精度的float字段,除了1、0之外,对于小数无法精确查询,原因是在 mysql 中float是浮点数,存储的时候是近似值,所以用精确查找无法匹配;但可以用like去匹配,也可以使用format、concat函数去查询。

1)使用format函数:

  1. mysql> select * from test where format(c2,2)=0.92;
  2. +----+------+------+----+------+
  3. | id | c1 | c2 | c3 | c4 |
  4. +----+------+------+----+------+
  5. | 1 | 0.92 | 0.92 | 1 | 0.92 |
  6. +----+------+------+----+------+
  7. 1 row in set
  8. mysql> select * from test where format(c2,2)=0.01;
  9. +----+------+------+----+------+
  10. | id | c1 | c2 | c3 | c4 |
  11. +----+------+------+----+------+
  12. | 4 | 0.01 | 0.01 | 0 | 0.01 |
  13. +----+------+------+----+------+
  14. 1 row in set
  15. mysql> select * from test where format(c2,1)=1.1;
  16. +----+-----+-----+----+-----+
  17. | id | c1 | c2 | c3 | c4 |
  18. +----+-----+-----+----+-----+
  19. | 2 | 1.1 | 1.1 | 1 | 1.1 |
  20. +----+-----+-----+----+-----+
  21. 1 row in set
  22. mysql> select * from test where format(c2,2)=1.1;
  23. +----+-----+-----+----+-----+
  24. | id | c1 | c2 | c3 | c4 |
  25. +----+-----+-----+----+-----+
  26. | 2 | 1.1 | 1.1 | 1 | 1.1 |
  27. +----+-----+-----+----+-----+
  28. 1 row in set
  29. mysql> select * from test where format(c2,1)=0.01;
  30. Empty set

这里我们可以得知,format函数第二个参数,可以大于小数点后面尾数,但是小于小数点后面尾数,也是查不出来的。

2)使用concat函数:

  1. mysql> select * from test where concat(c2,'')='0.01';
  2. +----+------+------+----+------+
  3. | id | c1 | c2 | c3 | c4 |
  4. +----+------+------+----+------+
  5. | 4 | 0.01 | 0.01 | 0 | 0.01 |
  6. +----+------+------+----+------+
  7. 1 row in set
  8. mysql> select * from test where concat(c2,'')='0.92';
  9. +----+------+------+----+------+
  10. | id | c1 | c2 | c3 | c4 |
  11. +----+------+------+----+------+
  12. | 1 | 0.92 | 0.92 | 1 | 0.92 |
  13. +----+------+------+----+------+
  14. 1 row in set
  15. mysql> select * from test where concat(c2,'')='1.1';
  16. +----+-----+-----+----+-----+
  17. | id | c1 | c2 | c3 | c4 |
  18. +----+-----+-----+----+-----+
  19. | 2 | 1.1 | 1.1 | 1 | 1.1 |
  20. +----+-----+-----+----+-----+
  21. 1 row in set

通过concat函数将小数转成了字符串,可以做到精确查询。

发表评论

表情:
评论列表 (有 0 条评论,608人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MySqlfloat类型查询

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