我的表中有一个字段ref varchar(255)
。
我有#个内部表和内部表,可用于各种查询。这些已经神秘地失败了,今天作为我进行的测试;
Select ref from Table1 where ref=6455186837893226538 group by ref
它返回了
ref
显然只有1个正确。我不确定在这里尝试调试什么。它看起来像桌子损坏吗?我确实注意到它似乎只选择前17位数字,但不确定其相关性。
答案 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: