Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mélange illégal de classements (utf8_unicode_ci,IMPLICIT) et (utf8_general_ci,IMPLICIT) pour l'opération '='

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