2016-09-06 28 views
0

我有一个简单的表:意外行为数由字母

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

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

它记录在Type Conversion for Expression Evaluation

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

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

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

还要注意的是, '10A' 查询(和 'A' 一个也)应该扔了一个警告。查询后查看SHOW WARNINGS;。你的客户应该已经提醒你注意到了一个警告。如果没有,你应该向供应商大声抱怨,因为这是违反行为。

1

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

没有第一个非数字前的任何数字(即他们开始用非数字)

文本值获得投0

我找不到声明此行为作为合同的参考,但这是一个SQLFiddle that shows it in action

+0

你能为此提供一个参考吗? –

+0

这只是MySQL吗?还是应该所有RDBMS都这样做? – dave

+0

@dave afaik它只是MySQL。如果遇到非数字,其他dbs会爆炸并输入错误。 – Bohemian