mysql查询结果正确_mysql 查询结果不正确

本文讨论了在MySQL中进行浮点数与字符串比较时出现的不匹配查询结果问题。当不加引号进行比较时,MySQL会将两者转换为浮点数进行比较,由于浮点数精度问题导致看似不相等的数值在比较时被当作相等。官方文档解释了这种行为,并建议确保比较时的值类型一致以避免此类问题。解决方法是确保比较的两个值都是整数或都是字符串。
摘要由CSDN通过智能技术生成

1.版本

1)操作系统

cat /etc/issue

cat /etc/issue

CentOS release 6.6 (Final)

Kernel \r on an \m

cat /proc/version

cat /proc/version

Linux version 2.6.32-504.el6.x86_64 (mockbuild@c6b9.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) ) #1 SMP Wed Oct 15 04:27:16 UTC 2014

2)mysql数据库版本

MySQL --version

MySQL  Ver 14.14 Distrib 5.6.26, for linux-glibc2.5 (x86_64) using  EditLine wrapper

2.问题描述

今天群里一位朋友抛出如下问题:

create table test_pi(a varchar(20));

insert into test_pi values('190000000010378172');

mysql> select a from test_pi where a=190000000010378188;

+--------------------+

| a                  |

+--------------------+

| 190000000010378172 |

+--------------------+

1 row in set (0.00 sec)

##明明不相等,为什么记录会被返回呢?可能很多朋友到会提醒加引号查询,但是不加引号为什么会出现这样不匹配的查询结果呢?

3.问题原因

http://dev.mysql.com/doc/refman/5.6/en/type-conversion.html

官方文档中Type Conversion in Expression Evaluation部分给出了解释。我只解释一下跟本问题相关的部分 ,select a from test_pi where a=190000000010378188;该查询会把a列值和190000000010378188都先转换成浮点数(string和number的比较),然后比较两个浮点数。

我们来看一下a列值和190000000010378188转换成浮点数后的结果:

mysql> select '190000000010378172' +0.0;

+---------------------------+

| '190000000010378172' +0.0 |

+---------------------------+

| 1.9000000001037818e17 |

+---------------------------+

1 row in set (0.01 sec)

mysql> select 190000000010378188 +0.0

-> ;

+-------------------------+

| 190000000010378188 +0.0 |

+-------------------------+

| 190000000010378188.0 |

+-------------------------+

1 row in set (0.00 sec)##1.9000000001037818e17=1.9000000001037818*10^17  我们看到下面的比上面的多一位

接着我们看看在mysql中比较这两个浮点数会是怎么样的结果:

mysql> select 190000000010378188.0 - 1.9000000001037818e17;

+----------------------------------------------+

| 190000000010378188.0 - 1.9000000001037818e17 |

+----------------------------------------------+

| 0 |

+----------------------------------------------+

1 row in set (0.00 sec)

mysql> select 190000000010378188.0=1.9000000001037818e17;

+--------------------------------------------+

| 190000000010378188.0=1.9000000001037818e17 |

+--------------------------------------------+

| 1 |

+--------------------------------------------+

1 row in set (0.00 sec)##发现mysql认为这两个浮点数是一样的(虽然前面的值多了一位但是比较结果还是一样,这个应该跟浮点数的精度有关)

3.解决方法

mysql官方文档中有如下描述:

If both arguments in a comparison operation are strings, they are compared as strings

If both arguments are integers, they are compared as integers

所以我们要做的就是确保用来比较的两个值类型一致(要么都是整数要么都是string)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值