Mysql 返回的多条记录不';与字段值不匹配
我的表中有一个字段Mysql 返回的多条记录不';与字段值不匹配,mysql,duplicates,Mysql,Duplicates,我的表中有一个字段ref varchar(255) 我有一系列的内部和内部表,用于各种查询。这些考试一直神秘地失败,今天我参加了一次考试 Select ref from Table1 where ref=6455186837893226538 group by ref 它回来了 参考号 6455186837893226533 6455186837893226534 6455186837893226535 6455186837893226536 6455186837893226537 6455
ref varchar(255)
我有一系列的内部和内部表,用于各种查询。这些考试一直神秘地失败,今天我参加了一次考试
Select ref from Table1 where ref=6455186837893226538 group by ref
它回来了
参考号
- 6455186837893226533
- 6455186837893226534
- 6455186837893226535
- 6455186837893226536
- 6455186837893226537
- 6455186837893226538
显然,只有1是正确的。我甚至不确定在这里调试什么。看起来像是桌子损坏吗?我注意到它似乎只选择了前17位,但不确定其相关性。您的代码将字符串与数字进行比较,当数字太大时,可能会产生意外值(在这种情况下,MySQL会进行浮点数字比较)。它也相当低效,因为它会导致将字符串转换为数字,这会破坏现有索引 相反,您需要执行字符串比较,方法是将数字用单引号括起来:
select ref from Table1 where ref = '6455186837893226538' group by ref
请注意,您的查询目的相当不明确;您正在对同一列进行筛选、分组和选择,这没有多大意义。,您正在将整数与字符串进行比较。应该是这样
select ref
from Table1
where ref='6455186837893226538'
group by ref
但是为什么你会得到你想要的结果呢?一些实验
insert into refs values
('64551868378932265'),
('645518683789322653'),
('6455186837893226539'),
('64551868378932265391'),
('6455186837893226531'),
('6455186837893226512'),
('6455186837893226123'),
('6455186837893221234');
select ref
from refs
where ref=6455186837893226539;
6455186837893226539
6455186837893226531
6455186837893226512
6455186837893226123
截止日期为6455186837893226。MySQL必须强制转换ref
或6455186837893226。可能有什么东西正在被截短,MySQL喜欢默默地截短
select cast(6455186837893226539 as char);
6455186837893226539
否。将字符串强制转换为整数如何?6455186837893226539非常接近64位整数的极限
select cast('6455186837893226539' as signed);
6455186837893226539
select cast('6455186837893226539' as unsigned);
6455186837893226539
没有
这是MySQL。你能用什么最愚蠢的方式投这个球?A
有6455186837893226
MySQL决定,将varchar与整数进行比较时,最好将两边都转换为双精度:facepalm:如果你用单引号括起数字,比如
where ref='6455186837893226538'
,它是否有效?@GMB是的,事实上它确实有效。你使用的是哪个版本的MySQL?就组而言,我只是试图返回代表性的值,因为(目前)这些值不是唯一的。实际上,我只是查看主表,看看问题是什么/是否存在。如果我在表之间进行选择,例如T1.ref=T2.ref,会发生什么情况?这是否执行了字符串比较?@user3649739将根据列的类型(即varchar)对它们进行比较。
select cast('6455186837893226533' as float);
6.45519e18
select cast('6455186837893226539' as double);
6.455186837893226e18