Standardsorteringen for lagrede procedureparametre er utf8_general_ci
og du kan ikke blande sammenstillinger, så du har fire muligheder:
Mulighed 1 :tilføje COLLATE
til din inputvariabel:
SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE added
CALL updateProductUsers(@rUsername, @rProductID, @rPerm);
Mulighed 2 :tilføje COLLATE
til 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
Mulighed 3 :tilføj det til IN
parameterdefinition (præ-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
Mulighed 4 :ændre selve feltet:
ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;
Medmindre du skal sortere data i Unicode-rækkefølge, vil jeg foreslå, at du ændrer alle dine tabeller til at bruge utf8_general_ci
sortering, da det ikke kræver kodeændringer og vil fremskynde sorteringen en smule.
OPDATERING :utf8mb4/utf8mb4_unicode_ci er nu den foretrukne tegnsæt/sorteringsmetode. utf8_general_ci frarådes, da præstationsforbedringen er ubetydelig. Se https://stackoverflow.com/a/766996/1432614