【问题标题】:MySQL stored procedure where clause is not filtering recordsMySQL存储过程where子句不过滤记录
【发布时间】:2017-12-29 23:10:11
【问题描述】:

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

很奇怪。我做错了什么?

【问题讨论】:

  • 在过程中重命名您的 id 参数,这样您的查询使用的参数就不会产生矛盾...

标签: mysql stored-procedures guid


【解决方案1】:

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

【讨论】:

  • 呸!认为这是蹩脚的东西。我是 mysql 新手,所以我假设 quoting 该字段会处理这个问题。
  • 避免在代码中引入歧义是一种很好的做法——但不用担心! SQL 语言经常会在查询中发现歧义,但在存储过程中并不总是如此。
  • ^^^ "结构化查询语言语言"漫长的一天。
  • 通常会,但我来自 mssql 多年,在那里你可以摆脱这种事情。每天学习新东西!
【解决方案2】:

重命名你的proc的参数:

create procedure select_item_by_id (
    in idToTest char(32)
)

并使用

    where
        `id` = idToTest;

避免歧义。

【讨论】:

  • 欣赏!!
猜你喜欢
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 2014-01-24
  • 2021-01-22
  • 1970-01-01
  • 2015-04-10
相关资源
最近更新 更多