Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Mistura ilegal de agrupamentos (utf8_unicode_ci,IMPLICIT) e (utf8_general_ci,IMPLICIT) para operação '='


O agrupamento padrão para parâmetros de procedimento armazenado é utf8_general_ci e você não pode misturar agrupamentos, então você tem quatro opções:

Opção 1 :adicione COLLATE para sua variável de entrada:
SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE added
CALL updateProductUsers(@rUsername, @rProductID, @rPerm);

Opção 2 :adicione COLLATE para WHERE cláusula:
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

Opção 3 :adicione-o ao IN definição de parâmetro (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

Opção 4 :altere o próprio campo:
ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;

A menos que você precise classificar dados em ordem Unicode, sugiro alterar todas as suas tabelas para usar utf8_general_ci collation, pois não requer alterações de código e acelerará um pouco a classificação.

ATUALIZAÇÃO :utf8mb4/utf8mb4_unicode_ci agora é o método de agrupamento/conjunto de caracteres preferido. utf8_general_ci é desaconselhado, pois a melhoria de desempenho é insignificante. Consulte https://stackoverflow.com/a/766996/1432614