MySQL存储过程where子句不过滤记录

时间:2017-12-29 23:10:12

标签: mysql stored-procedures guid

我正在使用一个数据库,其中键都是二进制(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');

非常奇怪。我做错了什么?

2 个答案:

答案 0 :(得分:3)

WHERE id = id总是可能会评估为true,因为它可能会检查行的id是否等于它自己。将参数重命名为其他内容。

答案 1 :(得分:2)

重命名proc的参数:

create procedure select_item_by_id (
    in idToTest char(32)
)

并使用

    where
        `id` = idToTest;

避免含糊不清。