Domyślne sortowanie parametrów procedury składowanej to utf8_general_ci
i nie możesz mieszać zestawień, więc masz cztery opcje:
Opcja 1 :dodaj COLLATE
do zmiennej wejściowej:
SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE added
CALL updateProductUsers(@rUsername, @rProductID, @rPerm);
Opcja 2 :dodaj COLLATE
do WHERE
klauzula:
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
Opcja 3 :dodaj go do IN
definicja parametru (pre-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
Opcja 4 :zmień samo pole:
ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;
O ile nie musisz sortować danych w kolejności Unicode, sugerowałbym zmianę wszystkich tabel tak, aby używały utf8_general_ci
sortowanie, ponieważ nie wymaga zmian w kodzie i nieco przyspieszy sortowanie.
AKTUALIZUJ :utf8mb4/utf8mb4_unicode_ci jest teraz preferowanym zestawem znaków/metodą sortowania. Odradza się stosowanie utf8_general_ci, ponieważ poprawa wydajności jest znikoma. Zobacz https://stackoverflow.com/a/766996/1432614