我有一张简单的表格:
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。
答案 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。