Výchozí řazení pro parametry uložené procedury je utf8_general_ci
a nemůžete kombinovat porovnávání, takže máte čtyři možnosti:
Možnost 1 :přidejte COLLATE
do vaší vstupní proměnné:
SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE added
CALL updateProductUsers(@rUsername, @rProductID, @rPerm);
Možnost 2 :přidejte COLLATE
do WHERE
klauzule:
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
Možnost 3 :přidejte jej do IN
definice parametru (před 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
Možnost 4 :změňte samotné pole:
ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;
Pokud nepotřebujete třídit data v pořadí Unicode, navrhoval bych změnit všechny vaše tabulky tak, aby používaly utf8_general_ci
řazení, protože nevyžaduje žádné změny kódu a mírně urychlí řazení.
AKTUALIZACE :utf8mb4/utf8mb4_unicode_ci je nyní preferovanou znakovou sadou/metodou řazení. utf8_general_ci se nedoporučuje, protože zlepšení výkonu je zanedbatelné. Viz https://stackoverflow.com/a/766996/1432614