我在使用简单SELECT
子句的表上执行WHERE
时会看到奇怪的行为,返回的记录不完全匹配。
我的表有一列id int(11)
作为主键。例如,要查找id为5350的记录,以下两个查询都会返回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找不到记录?
答案 0 :(得分:1)
在第二个查询中,ID值不是整数。在运行查询之前,您需要确保该值是一个整数,否则它会将值转换为此值。
答案 1 :(得分:1)
它正在将其解析为数字,因为该字段为Int。如果你使用say just =“abcd”它会解析为零。
哦,你不需要int值的引号
答案 2 :(得分: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,它会解析所有字段。
答案 3 :(得分:0)
试试这个:
$where = array('id' => $my_id);
$this->db->where($where);
答案 4 :(得分:0)
$where = "id=".((string)(int)$my_id === $my_id ? $my_id : 0);
$this->db->where($where);
但是这个解决方案仍然很难看,因为你什么都不做查询。在进行查询之前,您应该检查$my_id
是否正确。