MySQL-存储过程-尝试使用输出参数时的怪异

MySQL-存储过程-尝试使用输出参数时的怪异,mysql,stored-procedures,stored-functions,output-parameter,Mysql,Stored Procedures,Stored Functions,Output Parameter,老实说,我现在觉得自己很蠢。但这根本不起作用 场景 我有一个包含输出参数的存储过程。我试图在该参数中选择一个值。这似乎很简单,但它继续给我错误的结果。我查阅了许多网上资料,我确信我正在努力把它做好。 代码 DELIMITER // CREATE PROCEDURE `spGetId`( IN ParamA VARCHAR(32), OUT OutputId INT ) BEGIN SELECT `id` INTO OutputId FROM `Table`

老实说,我现在觉得自己很蠢。但这根本不起作用

场景
我有一个包含输出参数的存储过程。我试图在该参数中选择一个值。这似乎很简单,但它继续给我错误的结果。我查阅了许多网上资料,我确信我正在努力把它做好。


代码

DELIMITER //
CREATE PROCEDURE `spGetId`(
    IN ParamA VARCHAR(32),
    OUT OutputId INT
)
BEGIN
    SELECT `id` INTO OutputId
    FROM `Table`
    WHERE `column_a` = ParamA;
END//

CALL spGetId('foobar', @Bloop)//
SELECT @Bloop//

结果
我在这个表中有两行,它们的ID是'1'和'2'。无论SELECT语句是否匹配任何内容,我返回的结果都是“31”。 我尝试了许多变体,包括完全删除WHERE子句,让SELECT返回参数中的计数(1)(尽管只有2行,但结果为'32'),并且在存储过程调用中使用@Bloop变量之前,我尝试使用
SET@Bloop=0
“声明”该变量

如果您对发生这种情况的原因有任何见解,以及我能做些什么使其返回正确的值,我将不胜感激。另外,如果您能告诉我如何使用存储函数实现相同的期望结果,而不是返回值,我将更加感激!我想要的方法是使用存储函数,但我也遇到了类似的问题,然后放弃并尝试使用存储过程,结果发现得到了类似的结果

你能提供的任何东西都会有帮助

编辑

CREATE TABLE `Table` (
 `id` int(11) NOT NULL auto_increment,
 `column_a` varchar(32) character set utf8 NOT NULL,
 PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

mysql> SELECT * FROM Table;
+------+----------+
| id   | column_a |
+------+----------+
|    1 | asdf     |
|    2 | foobar   |
+------+----------+

当我使用任何参数调用spGetId()时,它返回值“31”(即使参数是“foobar”,它也会返回整数值“2”(或ascii 0x32))。如果我修改spGetId()以返回表的总行数,而不是返回“2”,它将返回“32”。

您存储的进程正在工作。我认为它返回的是字符“1”的ascii值,而不是整数值1。

我需要学会改变我的测试环境

我仍然不确定到底是什么问题,但看起来phpMyAdmin自己在执行某种类型的类型转换,我一直在通过那个特定的客户端运行我的所有测试

我自己编写了一个快速PHP脚本并手动调用存储过程(在进一步的测试中,还调用了一个存储函数)提供了所需的结果


所以,从中吸取的教训是:永远不要信任客户。记得把它调高一点。

你能显示“显示创建表<代码>表”和“从<代码>表”中选择*的输出吗?请尝试调用
显示警告调用spGetId('bleep',@Bloop)
之后的code>就好像是通过最新编辑的
创建表
测试的类型转换,它可以正常工作。你确定你在正确的数据库上测试这个吗?@Alexandre抱歉,我不太确定你所说的“正确的数据库”是什么意思。这听起来很可行。但是,它应该返回的ID是“2”,所以我不确定它为什么会返回“1”。如果列是int(11),存储过程返回值是int(11),为什么它会返回ascii值?你知道那里还会有其他的事情吗?