Съпоставянето по подразбиране за параметрите на съхранената процедура е utf8_general_ci
и не можете да смесвате композиции, така че имате четири опции:
Опция 1 :добавете COLLATE
към вашата входна променлива:
SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE added
CALL updateProductUsers(@rUsername, @rProductID, @rPerm);
Вариант 2 :добавете COLLATE
до WHERE
клауза:
CREATE PROCEDURE updateProductUsers(
IN rUsername VARCHAR(24),
IN rProductID INT UNSIGNED,
IN rPerm VARCHAR(16))
BEGIN
UPDATE productUsers
INNER JOIN users
ON productUsers.userID = users.userID
SET productUsers.permission = rPerm
WHERE users.username = rUsername COLLATE utf8_unicode_ci -- COLLATE added
AND productUsers.productID = rProductID;
END
Вариант 3 :добавете го към IN
дефиниране на параметър (преди MySQL 5.7):
CREATE PROCEDURE updateProductUsers(
IN rUsername VARCHAR(24) COLLATE utf8_unicode_ci, -- COLLATE added
IN rProductID INT UNSIGNED,
IN rPerm VARCHAR(16))
BEGIN
UPDATE productUsers
INNER JOIN users
ON productUsers.userID = users.userID
SET productUsers.permission = rPerm
WHERE users.username = rUsername
AND productUsers.productID = rProductID;
END
Вариант 4 :променя самото поле:
ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;
Освен ако не трябва да сортирате данните в Unicode ред, предлагам да промените всичките си таблици, за да използвате utf8_general_ci
съпоставяне, тъй като не изисква промени в кода и леко ще ускори сортирането.
АКТУАЛИЗИРАНЕ :utf8mb4/utf8mb4_unicode_ci вече е предпочитаният метод за набор от знаци/съпоставяне. utf8_general_ci не се препоръчва, тъй като подобрението на производителността е незначително. Вижте https://stackoverflow.com/a/766996/1432614