为什么“10ddd”在我的SQL查询中等于“10”?

时间:2011-04-26 07:07:23

标签: mysql

我遇到了一个奇怪的问题..

我得到了一个包含以下字段的表:

id          smallint(5)
client_id   smallint(5)
name        varchar(50)
pass        varbinary(20)

我得到了以下值的行:

id          = 5
client_id   = 10
name        = 'user'
pass        = '123'

但是如果我在client_id之后放入一些字符,它仍会返回行???

此查询不应该返回任何内容......嗯

SELECT id
FROM db.user
WHERE client_id='10ddd' && name='user' && pass='123'

1 个答案:

答案 0 :(得分:3)

这是因为mySQL会自动转换用于int列的字符串值,从而切断所有非整数内容。

在此过程中,10ddd会被截断为10

请参阅11.2. Type Conversion in Expression Evaluation

我认为可以使用更严格的server modes来关闭,但我在文档中看不到任何内容。如果做不到这一点,我不知道一个简单的解决方法!

根据值的来源,您可以在执行查询之前检查值,例如:在PHP中使用is_int();如果值不是整数,则退出。