首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是什么原因造成的,当数值大于一定数量的数字时,结果将是不同的?

问是什么原因造成的,当数值大于一定数量的数字时,结果将是不同的?
EN

Stack Overflow用户
提问于 2020-10-17 09:21:06
回答 1查看 33关注 0票数 1

我很抱歉,在审理所有案件之前,我匆忙地发了一封电子邮件,向大家说了声对不起!按照你的回答,我试着推翻了之前的想法。随着数字的变化,我很困惑。我还没有测试过有多少位数是正常的,但我认为这个例子应该能解释这一点。当将字符串类型与数字类型进行比较时,当数字数大于某个值时,只返回与要查询的数字数相同的结果,但有两种情况。其他数字是一样的吗?我没有一个一个地尝试。想知道是什么导致了它,隐式类型转换还是什么?

代码语言:javascript
复制
  CREATE TABLE `user` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(20) CHARACTER SET latin1 DEFAULT NULL,
    `simid` varchar(50) CHARACTER SET latin1 NOT NULL DEFAULT '',
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

    INSERT INTO `user` (`id`, `name`, `simid`)
    VALUES
    (1, 'ccc', '6441760021201308940'),
    (3, 'bb', '6441760021201308941'),
    (4, 'bb', '6441760021201308942');
    
    select * from user where simuid = 6441760021201308940;
    result:
    1 ccc 6441760021201308940
    3 bb 6441760021201308941
    4 bb 6441760021201308942
    
    but :select * from user where simuid = '6441760021201308940';
    result:
    1 ccc 6441760021201308940

    mysql> select * from user;
    +------+------+------------------------+
    | id   | name | simid                  |
    +------+------+------------------------+
    |    5 | ccc  | 6441760021201307159    |
    |    6 | ccc  | 6441760021201307160    |
    |    7 | ccc  | 6441760021201307001    |
    |    8 | ccc  | 6441760021201307000    |
    |    9 | qqq  | 6441760021201308159    |
    |   10 | sss  | 6441760021201308160    |
    |   12 | jjj  | 641760021201308162     |
    |   13 | sss  | 6441760021201308161    |
    |   14 | jjj  | 6417600212013081620    |
    |   15 | sss  | 64417600212013081610   |
    |   21 | zzz  | 6441760021201308970    |
    |   51 | ccc  | 6441760021201308940    |
    |   52 | ddd  | 6441760021201308945    |
    |   53 | bb   | 6441760021201308941    |
    |   54 | bb   | 6441760021201308942    |
    |   55 | eee  | 6441760021201308946    |
    |  100 | sss  | 6441760021201308161000 |
    |  101 | jjj  | 641760021201308162000  |
    |  200 | sss  | 6441760021201308168000 |
    |  201 | jjj  | 6441760021201308169000 |
    | 1000 | aaa  | 64410                  |
    | 1001 | bbb  | 64411                  |
    +------+------+------------------------+
    22 rows in set (0.00 sec)

    select * from user where simid = 6441760021201307159;
        +----+------+---------------------+
        | id | name | simid               |
        +----+------+---------------------+
        |  5 | ccc  | 6441760021201307159 |
        |  6 | ccc  | 6441760021201307160 |
        |  9 | qqq  | 6441760021201308159 |
        | 10 | sss  | 6441760021201308160 |
        +----+------+---------------------+

mysql> select * from user where simid = 6441760021201308160000;
+-----+------+------------------------+
| id  | name | simid                  |
+-----+------+------------------------+
| 100 | sss  | 6441760021201308161000 |
| 200 | sss  | 6441760021201308168000 |
| 201 | jjj  | 6441760021201308169000 |
+-----+------+------------------------+
3 rows in set (0.01 sec)
mysql> select * from user where simid = 6441760021201308160;
+----+------+---------------------+
| id | name | simid               |
+----+------+---------------------+
|  5 | ccc  | 6441760021201307159 |
|  6 | ccc  | 6441760021201307160 |
|  9 | qqq  | 6441760021201308159 |
| 10 | sss  | 6441760021201308160 |
+----+------+---------------------+
4 rows in set (0.01 sec)

mysql> select * from user where simid = 6441760021201308161;
+----+------+---------------------+
| id | name | simid               |
+----+------+---------------------+
| 13 | sss  | 6441760021201308161 |
| 21 | zzz  | 6441760021201308970 |
| 51 | ccc  | 6441760021201308940 |
| 52 | ddd  | 6441760021201308945 |
| 53 | bb   | 6441760021201308941 |
| 54 | bb   | 6441760021201308942 |
| 55 | eee  | 6441760021201308946 |
+----+------+---------------------+
7 rows in set (0.00 sec)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-17 09:38:20

问题是,您要比较的VARCHAR和INTEGER值由MySQL转换为FLOAT数字,如在12.3表达式计算中的类型转换中定义的那样。

  • 在所有其他情况下,参数被比较为浮点数(实数).例如,字符串和数字操作数的比较是作为浮点数的比较进行的.

他们甚至有一个例子来说明你的问题:

为了说明,下面的比较中只有第一个比较相同的值,但这两个比较都返回true (1): mysql>选择'9223372036854775807‘= 9223372036854775807;-> 1选择'9223372036854775807’= 9223372036854775806;-> 1

解决方案很简单:不要比较VARCHAR和INTEGER值。或者,您可以使用上面的文档中提到的CAST()函数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64400898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档