SQL SELECT正在选择与查询不匹配的行

时间:2014-01-18 01:47:11

标签: php mysql

我使用php mysql_query()从我的SQL数据库中选择行,但由于某种原因,它选择的行与查询不匹配。例如:

mysql_query("SELECT * FROM Table WHERE ID='153'")

这将返回ID为153

的行

但是会这样:

mysql_query("SELECT * FROM Table WHERE ID='153c'")

我做错了吗?

2 个答案:

答案 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而不是字符串。