代码之家  ›  专栏  ›  技术社区  ›  Tsar Bomba

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

  •  0
  • Tsar Bomba  · 技术社区  · 7 年前

    我正在使用一个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');
    

    很奇怪。我做错了什么?

    2 回复  |  直到 7 年前
        1
  •  3
  •   ztaylor54    7 年前

    很可能 WHERE id = id 总是计算为true,因为它可能会检查行 id 等于自身。将参数重命名为其他名称。

        2
  •  2
  •   Patrick Artner    7 年前

    重命名过程的参数:

    create procedure select_item_by_id (
        in idToTest char(32)
    )
    

    和使用

        where
            `id` = idToTest;
    

    避免歧义。