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

标签 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');

我什至尝试传入一个字符串/字符并在存储过程中执行 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');

很奇怪。我做错了什么?

最佳答案

很可能 WHERE id = id 总是评估为真,因为它可能正在检查行的 id 是否等于它自己。将参数重命名为其他名称。

关于MySQL存储过程where子句不过滤记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48029413/

相关文章:

MySQL 5.6 程序通过 Workbench 的验证器但无法工作,错误代码 : 1064

c# - C# 中 GUID 的 pInvoke 方法

guid - Windows 中的 PID 分配策略/使用 PID 命名临时文件

php - Laravel:如何查询多个间接相关的表?

java - MYSQL 一类一个连接

mysql - 合并表和输出而不使用 Group By?

sql - 如果我在 guid 列上使用主键,如何提高性能?

mysql - SQL - 如何根据两个表获取总和?

sql-server - 从批处理文件执行存储过程

php - 存储过程中的准备语句是否可以避免 SQL 注入(inject)?