我正在尝试进行如下选择查询
SELECT * FROM `corporate_names` WHERE id = '1s';
但是它仍然给我结果,因为没有列ID的值等于“ 1s”。
它使我得到SELECT * FROM corporate_names WHERE id = '1';
的结果。
我不明白为什么会这样吗?我如何才能将id
列与字符串值完全匹配,因为id是具有int列类型的主键。
我希望它与列值完全匹配
答案 0 :(得分:1)
当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。一些转换是隐式发生的。例如,MySQL根据需要自动将数字转换为字符串,反之亦然。 例子
SELECT 1+'1'; -> 2
以下规则描述了比较操作如何发生转换:
有关详细信息,您可以阅读documentation
但是您可以按照以下方式停止它
SELECT case when CONVERT('1s' USING utf8) = cast( 1 as char) then 2 else 0 end; this will return 0 .
因此,明确的转换是阻止这种情况或解决您的问题的方式
答案 1 :(得分:0)
如果要获取所有ID以1开头的公司名称,请使用LIKE,如下所示:
SELECT * FROM `corporate_names` WHERE id LIKE '1%';
否则,如果您只想检索特定ID的结果,请使用以下命令:
SELECT * FROM `corporate_names` WHERE id='1';
我希望有帮助。
答案 2 :(得分:0)
我如下解决
SELECT * FROM `corporate_names` where CAST(id as char(255)) = '1s'.
现在它与列值完全匹配,我只是将id列转换为char。