Mysql 是什么原因造成的,当值大于某个位数时,结果会不同?
非常抱歉,在尝试所有案例之前,我匆忙发送了一封电子邮件,向所有人道歉!根据你的回答,我尝试并推翻了先前的想法。随着数字的变化,我很困惑。我还没有测试多少数字是正常的,但我相信这个例子应该能解释这一点。当字符串类型与数字类型进行比较时,当位数大于某个值时,只返回与要查询的位数相同的结果,但有两种情况。其他数字是一样的吗?我没有逐一尝试。想了解是什么导致了它,隐式类型转换还是什么Mysql 是什么原因造成的,当值大于某个位数时,结果会不同?,mysql,Mysql,非常抱歉,在尝试所有案例之前,我匆忙发送了一封电子邮件,向所有人道歉!根据你的回答,我尝试并推翻了先前的想法。随着数字的变化,我很困惑。我还没有测试多少数字是正常的,但我相信这个例子应该能解释这一点。当字符串类型与数字类型进行比较时,当位数大于某个值时,只返回与要查询的位数相同的结果,但有两种情况。其他数字是一样的吗?我没有逐一尝试。想了解是什么导致了它,隐式类型转换还是什么 CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL A
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)
问题是您试图比较的
VARCHAR
和INTEGER
值被MySQL转换为FLOAT
数字,如中所定义:
- 在所有其他情况下,参数作为浮点(实数)数进行比较。例如,字符串和数字操作数的比较是作为浮点数的比较进行的
解决方案很简单:不要比较
VARCHAR
和INTEGER
值。或者您可以使用上面文档中提到的函数。您发布了示例数据和查询,而不需要解释问题所在。你期望得到什么样的结果?什么不起作用?我只看到您试图将VARCHAR列与数字匹配。为什么?@forpas感谢您的提醒,让我再次编辑它。我无法重现您的问题:simid
与simuid
不同@forpas我很抱歉,但发生这种情况是因为我认为它与字符集有关,并且字符集已针对字段进行了修改,但字段名已更改。
mysql> SELECT '9223372036854775807' = 9223372036854775807;
-> 1
mysql> SELECT '9223372036854775807' = 9223372036854775806;
-> 1