Mysql
 sql >> Database >  >> RDS >> Mysql

Combinazione illegale di regole di confronto (utf8_unicode_ci,IMPLICIT) e (utf8_general_ci,IMPLICIT) per l'operazione '='

Le regole di confronto predefinite per i parametri della procedura memorizzata sono utf8_general_ci e non puoi mischiare le regole di confronto, quindi hai quattro opzioni:

Opzione 1 :aggiungi COLLATE alla tua variabile di input:

SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE added
CALL updateProductUsers(@rUsername, @rProductID, @rPerm);

Opzione 2 :aggiungi COLLATE al WHERE clausola:

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

Opzione 3 :aggiungilo al IN definizione del parametro (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

Opzione 4 :modifica il campo stesso:

ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;

A meno che non sia necessario ordinare i dati in ordine Unicode, suggerirei di modificare tutte le tabelle per utilizzare utf8_general_ci confronto, poiché non richiede modifiche al codice e accelererà leggermente l'ordinamento.

AGGIORNAMENTO :utf8mb4/utf8mb4_unicode_ci è ora il metodo di confronto/set di caratteri preferito. utf8_general_ci è sconsigliato, poiché il miglioramento delle prestazioni è trascurabile. Vedi https://stackoverflow.com/a/766996/1432614