返回多个与字段值不匹配的记录

时间:2020-06-25 00:56:28

标签: mysql duplicates

我的表中有一个字段ref varchar(255)

我有#个内部表和内部表,可用于各种查询。这些已经神秘地失败了,今天作为我进行的测试;

Select ref from Table1 where ref=6455186837893226538 group by ref

它返回了

ref

  • 6455186837893226533
  • 6455186837893226534
  • 6455186837893226535
  • 6455186837893226536
  • 6455186837893226537
  • 6455186837893226538

显然只有1个正确。我不确定在这里尝试调试什么。它看起来像桌子损坏吗?我确实注意到它似乎只选择前17位数字,但不确定其相关性。

2 个答案:

答案 0 :(得分:1)

您的代码将字符串与数字进行比较,当数字太大时,这可能会产生意外的值(在这种情况下,MySQL会进行浮点数比较)。它也相当低效,因为它会导致将字符串转换为数字,从而破坏现有索引。

相反,您需要通过使用单引号将数字引起来来进行字符串比较:

select ref from Table1 where ref = '6455186837893226538' group by ref

请注意,查询的目的还不清楚。您在同一列上进行过滤,分组和选择,这没有任何意义。

答案 1 :(得分:1)

As @GMB points out,您正在将整数与字符串进行比较。应该是这个。

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。您最笨的方式是什么? floating point number

select cast('6455186837893226533' as float);
6.45519e18

select cast('6455186837893226539' as double);
6.455186837893226e18

有6455186837893226。

MySQL决定将varchar与整数进行比较时最好的做法是将双方都转换为双精度。 :facepalm: