1

SELECT在使用简单子句的表上执行 a 时,我看到了奇怪的行为,WHERE返回的记录不完全匹配。

我的表有一列id int(11)作为主键。例如,要查找 id 为 5350 的记录,以下 2 个查询均返回 id 为 5350 的记录。

SELECT * FROM mytable WHERE id="5350"
SELECT * FROM mytable WHERE id="5350abcd"

我的一个想法是删除 5350 附近的“”,但我得到了相同的结果。在codeigniter中,我试过这个:

$where = "id=$my_id";
$this->db->where($where);

为什么会发生这种情况,我该如何解决,以便不准确的 id 找不到记录?

4

5 回答 5

1

在第二个查询中,ID 值不是整数。您需要在运行查询之前确保该值是整数,否则它将将该值强制转换为整数。

于 2012-12-14T16:44:21.907 回答
1

它将它解析为一个数字,因为该字段是 Int。如果你只说 ="abcd" 它会解析为零。

哦,你不需要 int 值的引号

于 2012-12-14T16:45:06.387 回答
1

我的猜测是它会解析出这些字母,因为它是 int 类型的。它忽略了所有 alpha 的东西。因为它具有相同的 ID 并添加了数字,所以它解析为字母之前的数字。

5350 <-- INT
5350abcd <--- 'abcd' gets parsed out because it's not of INT type. 
You end up with 5350 without the abcd at the end. 

如果您的字段是数据类型 varchar 它会解析所有的。

于 2012-12-14T16:50:03.763 回答
0

试试这个:

$where = array('id' => $my_id);
$this->db->where($where);
于 2012-12-14T16:47:44.533 回答
0
$where = "id=".((string)(int)$my_id === $my_id ? $my_id : 0);
$this->db->where($where);

但是这个解决方案仍然很丑,因为你什么都不做查询。您应该$my_id在查询之前检查是否正确。

于 2012-12-14T16:47:44.987 回答