MySQL存储过程where子句不过滤记录
我正在使用一个数据库,其中的键都是二进制的(16),基本上存储为一个GUID,其中有几个值被翻转。我有一个简单的存储过程,我想通过ID过滤出一个单独的存储过程MySQL存储过程where子句不过滤记录,mysql,stored-procedures,guid,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
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');
很奇怪。我做错了什么?重命名进程的参数:
create procedure select_item_by_id (
in idToTest char(32)
)
和使用
where
`id` = idToTest;
避免歧义。重命名程序的参数:
create procedure select_item_by_id (
in idToTest char(32)
)
和使用
where
`id` = idToTest;
为了避免歧义。可能
其中id=id
总是计算为true,因为它可能检查行的id
是否等于自身。将参数重命名为其他名称 很可能其中id=id
总是计算为true,因为它可能检查行的id
是否等于自身。将参数重命名为其他名称 在过程中重命名您的id参数,这样您的查询使用的参数就没有矛盾了…在过程中重命名您的id参数,这样您的查询使用的参数就没有矛盾了…呸!我觉得这是个蹩脚的东西。我是mysql新手,所以我假设quoting
字段会处理这个问题。避免在代码中引入歧义是一个很好的做法,但不用担心!通常SQL语言会在查询中捕捉到歧义,但不总是在存储过程中。^^^^“结构化查询语言”是漫长的一天。通常会,但我来自mssql多年,在那里你可以摆脱这种事情。每天学习新的东西!呸!我觉得这是个蹩脚的东西。我是mysql新手,所以我假设quoting
字段会处理这个问题。避免在代码中引入歧义是一个很好的做法,但不用担心!通常SQL语言会在查询中捕捉到歧义,但不总是在存储过程中。^^^^“结构化查询语言”是漫长的一天。通常会,但我来自mssql多年,在那里你可以摆脱这种事情。每天学习新的东西!谢谢你!!谢谢你!!