Используя MySQL 8, я обнаруживаю неправильные результаты вывода при вызове хранимой процедуры

Вызов хранимой процедуры с использованием входных и выходных параметров возвращает разные результаты по сравнению с запуском кода хранимой процедуры непосредственно в виде запроса. Я не могу понять, почему MySQL 8 будет обрабатывать хранимую процедуру таким образом. Был бы признателен, если бы кто-нибудь мог объяснить это поведение и причину этого.

Версия MySQL: GPL версии 8.0.18

Реконструированный код

DELIMITER $$
USE `temp`$$

CREATE TABLE `TestTable` (
  `id1` smallint(5) unsigned NOT NULL,
  `id2` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `text1` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `text2` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0',
  UNIQUE KEY `uq_TestTable_id1_id2` (`id1`,`id2`),
  KEY `ix_TestTable_id1_id2` (`id1`,`id2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci$$

CREATE PROCEDURE `proc_test`(
    IN id1 smallint unsigned,
    IN id2 nvarchar(10),
    OUT outtext1 nvarchar(20),
    OUT outtext2 nvarchar(10)
    )
BEGIN

    SET outtext1 = '';
    SET outtext2 = '';

    SELECT
        `text1`, `text2`
        INTO outtext1, outtext2
    FROM  `TestTable`
    WHERE
        `id1` = id1 AND 
        `id2` = id2
    LIMIT 1;

END$$

INSERT INTO `TestTable`
(`id1`, `id2`, `text1`, `text2`)
VALUES
(1, 'id2', 'text1', 'text2')$$

DELIMITER ;

-- Returns text1 and text2 values
call proc_test(1, 'id2', @outtext1, @outtext2);
select @outtext1, @outtext2;

-- Should return nothing but returns text1 and text2 values while there is no id2 with a value of xxx
call proc_test(1, 'xxx', @outtext1, @outtext2);
select @outtext1, @outtext2;

-- Should return nothing but returns text1 and text2 values while there is no id1 with a value of 9
call proc_test(9, 'id2', @outtext1, @outtext2);
select @outtext1, @outtext2;

-- Run normal query: Result text1 and text2 as expected
SELECT `text1`, `text2`
FROM  `TestTable`
WHERE `id1` = 1 AND `id2` = 'id2';

-- Run normal query: Result is empty as expected
SELECT `text1`, `text2`
FROM  `TestTable`
WHERE `id1` = 1 AND `id2` = 'xxx';

-- Run normal query: Result is empty as expected
SELECT `text1`, `text2`
FROM  `TestTable`
WHERE `id1` = 9 AND `id2` = 'id2';

-- Cleanup
DROP PROCEDURE `proc_test`;
DROP TABLE `testtable`;


person Mc van Staaden    schedule 19.02.2020    source источник
comment
Входные данные вашей процедуры имеют те же имена, что и ваши столбцы, поэтому MySQL обрабатывает `id1` = id1 как столбец id1; следовательно, условие всегда истинно. Просто измените имена ввода, например. dbfiddle.uk/   -  person Nick    schedule 19.02.2020
comment
Спасибо, Ник. Это правильно. Входной параметр и имя столбца не могут совпадать.   -  person Mc van Staaden    schedule 19.02.2020