Standardsorteringen för parametrar för lagrad procedur är utf8_general_ci
och du kan inte blanda sammanställningar, så du har fyra alternativ:
Alternativ 1 :lägg till COLLATE
till din indatavariabel:
SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE added
CALL updateProductUsers(@rUsername, @rProductID, @rPerm);
Alternativ 2 :lägg till COLLATE
till WHERE
klausul:
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
Alternativ 3 :lägg till den i IN
parameterdefinition (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
Alternativ 4 :ändra själva fältet:
ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;
Om du inte behöver sortera data i Unicode-ordning, skulle jag föreslå att du ändrar alla dina tabeller så att de använder utf8_general_ci
sortering, eftersom det inte kräver några kodändringar och kommer att påskynda sorteringen något.
UPPDATERA :utf8mb4/utf8mb4_unicode_ci är nu den föredragna teckenuppsättningen/sorteringsmetoden. utf8_general_ci avråds från, eftersom prestandaförbättringen är försumbar. Se https://stackoverflow.com/a/766996/1432614