Le classement par défaut des paramètres de procédure stockée est utf8_general_ci
et vous ne pouvez pas mélanger les classements, vous avez donc quatre options :
Option 1 :ajouter COLLATE
à votre variable d'entrée :
SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE added
CALL updateProductUsers(@rUsername, @rProductID, @rPerm);
Option 2 :ajouter COLLATE
au WHERE
clause :
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
Option 3 :ajoutez-le au IN
définition des paramètres (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
Option 4 :modifier le champ lui-même :
ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;
Sauf si vous avez besoin de trier les données dans l'ordre Unicode, je suggérerais de modifier toutes vos tables pour utiliser utf8_general_ci
classement, car il ne nécessite aucune modification du code et accélère légèrement les tris.
MISE À JOUR :utf8mb4/utf8mb4_unicode_ci est désormais la méthode préférée de jeu de caractères/collation. utf8_general_ci est déconseillé, car l'amélioration des performances est négligeable. Voir https://stackoverflow.com/a/766996/1432614