我正在使用一个数据库,其中键都是二进制(16),基本上存储为GUID,其中有几个值被翻转。我有一个简单的存储过程,我想通过ID过滤掉一个。
delimiter //
create procedure select_item_by_id (
in id binary(16)
)
begin
select
`id`,
`name`
from
`item`
where
`id` = id;
end //
delimiter ;
当我像这样开火时,它会拉回表中的所有记录,不会进行过滤:
call select_item_by_id(unhex('11e7deb1b1628696ad3894b2c0ab197a'));
但是,如果我手动运行它...它会完全按预期过滤记录:
select
`id`,
`name`
from
`item`
where
`id` = unhex('11e7deb1b1628696ad3894b2c0ab197a');
我甚至试过传入一个字符串/字符并在sproc内部执行unhex,但是这会得到零结果:
delimiter //
create procedure select_item_by_id (
in id char(32)
)
begin
select
`id`,
`name`
from
`item`
where
`id` = unhex(id);
end //
delimiter ;
call select_item_by_id('11e7deb1b1628696ad3894b2c0ab197a');
非常奇怪。我做错了什么?
答案 0 :(得分:3)
WHERE id = id
总是可能会评估为true,因为它可能会检查行的id
是否等于它自己。将参数重命名为其他内容。
答案 1 :(得分:2)
重命名proc的参数:
create procedure select_item_by_id (
in idToTest char(32)
)
并使用
where
`id` = idToTest;
避免含糊不清。