我使用php mysql_query()从我的SQL数据库中选择行,但由于某种原因,它选择的行与查询不匹配。例如:
mysql_query("SELECT * FROM Table WHERE ID='153'")
这将返回ID为153
的行但是会这样:
mysql_query("SELECT * FROM Table WHERE ID='153c'")
我做错了吗?
答案 0 :(得分:1)
如上所述,问题是将字符串值与整数值进行比较。你的表达是:
WHERE ID = '153' and
WHERE ID = '153a'
你可以想象MySQL引擎描述它的作用:“id
是一个整数列。所以,我需要将它与一个整数值进行比较。哦,右边是一个字符串,所以我会将右侧转换为整数。“
MySQL将值从字符串转换为数字的方式可称为“静默转换”。它会转换找到的最长的前导号码,然后停止。如果没有前导号码(例如'a123'
),则值为0
。没有产生错误。
如果您真的想让自己迷惑,请考虑以下事项:
select (case when 123 = '123e' then 1 else 0 end),
(case when 123 = '123e3' then 1 else 0 end),
(case when 123 = '123a' then 1 else 0 end),
(case when 123 = '123a3' then 1 else 0 end)
返回:true,false,true和true。为什么第二个是假的,但其他的是真的?好吧,'123e3'被解释为科学记数法,因此该值变为123,000。对于所有其他人,转换将停在第一个字母字符处。
正如其他答案中所提到的,显而易见的解决方法是将单引号放在常量上。
答案 1 :(得分:0)
为什么要将ID值作为String传递?这很可能是你的问题。请尝试传递以下查询:
mysql_query("SELECT * FROM Table WHERE ID= 153")
这样,要搜索的ID值是int(或ID列设置为的任何其他原语)。这应该正确地限制ID。此外,如果要使用数字创建ID,最佳做法是仅使用不同的int而不是字符串。