MySQL返回多个与搜索条件不匹配的行

MySQL返回多个与搜索条件不匹配的行,mysql,casting,floating-point,comparison,precision,Mysql,Casting,Floating Point,Comparison,Precision,我在本地安装了MySQL,运行SELECT VERSION返回这个值:5.6.43-84.3 当我运行一个查询时,它返回多行,而它应该只返回一行。让我来安排一下,这样更容易解释 创建测试表: 将3个值加载到表中: 运行此查询此查询返回预期的1行: 运行此查询此查询返回3行,但不应返回: 以下是我对这种情况的观察: 第一个查询用单引号括住WHERE子句中的值。 第二个查询没有用单个tic围绕WHERE子句中的值。 测试表中的列定义为VARCHAR255 第一个查询只返回一行是有意义的,因为它将WH

我在本地安装了MySQL,运行SELECT VERSION返回这个值:5.6.43-84.3

当我运行一个查询时,它返回多行,而它应该只返回一行。让我来安排一下,这样更容易解释

创建测试表: 将3个值加载到表中: 运行此查询此查询返回预期的1行: 运行此查询此查询返回3行,但不应返回: 以下是我对这种情况的观察:

第一个查询用单引号括住WHERE子句中的值。 第二个查询没有用单个tic围绕WHERE子句中的值。 测试表中的列定义为VARCHAR255 第一个查询只返回一行是有意义的,因为它将WHERE子句中的字符串与测试表VARCHAR255中的字符串值进行比较 当MySQL将第二个查询的WHERE子句中的数值与测试表VARCHAR255中的字符串值进行比较时,出现了一些情况,这导致MySQL返回3行而不是1行。 第一个查询返回正确的结果是有意义的,因为它将字符串与字符串进行比较

第二个查询返回一个坏数据集3行,而不是它应该返回的1行,这在一定程度上也是合理的

但我的问题是MySQL为什么要这么做?为什么当它将一个数字与3个不同的VARCHAR255值进行比较时,当WHERE子句中的数值的真值仅与1行匹配时,它会返回所有3行

因此,对于第一个查询,MySQL的基本意思是:

“9671986020630615”=“9671986020630615”

“9671986020630615”“9671986020630616”

“9671986020630615”“9671986020630617”

但第二个问题是:

9671986020630615='9671986020630615'

9671986020630615='9671986020630616'

9671986020630615='9671986020630617'


任何帮助都将不胜感激。

MySQL在内部处理所有数字的方式与Javascript相同,具有

当您省略长数字字符串中的引号时,即您编写9671986020630615来代替“9671986020630615”,MySQL使用该数字。然后,当它运行查询的WHERE部分时,它会默默地将每个列值强制为一个双精度数字

但由于双精度的-,9671986020630615、9671986020630616和9671986020630617都具有相同的值。这三个都在哪里

CAST(9671986020630615 AS DOUBLE) CAST(9671986020630616 AS DOUBLE) CAST(9671986020630617 AS DOUBLE) 
     9.671986020630616e15             9.671986020630616e15             9.671986020630616e15 | 

看到这三个整数是如何用DOUBLE表示的了吗?

我猜MySQL试图将它们都解释为INT而不是BIGINT,因为INT不能保存这些值,所以它们最终是相同的值。使用sql FIDLE显示选择CAST9671986020630615作为签名和CASTtest_val作为签名都会导致测试表中所有行的结果为9671986020630616。@uuerdo将其作为答案发布,我将给您和upvote。是的,当我遇到这个的时候,周围没有人。自从我发布这个问题以来,我在这里问了一些工作人员,他们基本上就是这么说的,这与MySQL在将数字与字符串进行比较时不支持超过10位左右的数字有关。跟Jones说吧,看起来他们对数字进行了适当的研究,而不仅仅是猜测。@Uuerdo,你是一位绅士或淑女,也是一位学者,我欣赏你的风度。再次感谢。非常感谢您快速、准确和具体的回答。投票通过并被接受为答案。mysql文档中的这一页正好谈到了这个问题:
    INSERT INTO test_table (test_val)
    VALUES 
    ('9671986020630615'),
    ('9671986020630616'),
    ('9671986020630617')
    ;
    SELECT * 
    FROM test_table
    WHERE test_val = '9671986020630615'
    ;
    SELECT * 
    FROM test_table
    WHERE test_val = 9671986020630615
    ;
CAST(9671986020630615 AS DOUBLE) CAST(9671986020630616 AS DOUBLE) CAST(9671986020630617 AS DOUBLE) 
     9.671986020630616e15             9.671986020630616e15             9.671986020630616e15 |