当查找值时,SELECT的意外行为是数字后跟字母

时间:2016-09-06 04:31:19

标签: mysql sql

我有一张简单的表格:

Entity
   ID : int
   Name : varchar(10)

我正在通过他们的ID查找实体,并发现一个让我感到惊讶的结果。假设存在ID = 10的实体。当我运行以下查询时,我得到以下结果:

SELECT * from Entity WHERE ID = 10        Found Entity 10 (as expected)
SELECT * from Entity WHERE ID = '10'      Found Entity 10 (as expected)
SELECT * from Entity WHERE ID = A         Syntax error (as expected)
SELECT * from Entity WHERE ID = 'A'       Zero records found (as expected)
SELECT * from Entity WHERE ID = 10A       Syntax error (as expected)
SELECT * from Entity WHERE ID = '10A'     Found Entity 10 (WTF)

最后的查询似乎忽略了'A'并评估了查询,就像我刚刚传入了10一样。这不是我的预期。

这是标准行为吗?无论如何我找不到任何doco。

2 个答案:

答案 0 :(得分:2)

是的,它是MySQL的标准行为。

它记录在Type Conversion for Expression Evaluation下。

  

当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。某些转换是隐式发生的。例如,MySQL会根据需要自动将数字转换为字符串,反之亦然。

将字符串转换为数字会导致在第一个非数字字符处截断它,如果第一个字符不是数字,则为0。

另请参阅: Can I configure MySQL's typecasting to consider 0 != 'foo'?

另请注意,' 10A'查询(以及' A'也应该)已经发出警告。查询后SHOW WARNINGS;查看它。您的客户应该已经提醒您警告被抛出的事实。如果没有,你应该向供应商大声抱怨,因为这种行为已经破裂了。

答案 1 :(得分:1)

当将文本值转换为int时,正如MySQL在查找id之前使用文本文字一样,它的行为是使用所有数字直到第一个非数字。

在第一个非数字之前没有任何数字的文本值(即以非数字开头)将被转换为0。

我无法找到将此行为声明为合约的引用,但此处为SQLFiddle that shows it in action