sql >> Base de Datos >  >> RDS >> Mysql

Combinación ilegal de intercalaciones (utf8_unicode_ci,IMPLICIT) y (utf8_general_ci,IMPLICIT) para la operación '='

La intercalación predeterminada para los parámetros del procedimiento almacenado es utf8_general_ci y no puede mezclar intercalaciones, por lo que tiene cuatro opciones:

Opción 1 :agregar COLLATE a su variable de entrada:

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

Opción 2 :agregar COLLATE al 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

Opción 3 :añádelo a IN definición de parámetro (anterior a 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

Opción 4 :modifica el propio campo:

ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;

A menos que necesite ordenar los datos en orden Unicode, sugeriría modificar todas sus tablas para usar utf8_general_ci intercalación, ya que no requiere cambios de código y acelerará un poco la ordenación.

ACTUALIZAR :utf8mb4/utf8mb4_unicode_ci es ahora el método de intercalación/conjunto de caracteres preferido. Se desaconseja utf8_general_ci, ya que la mejora del rendimiento es insignificante. Ver https://stackoverflow.com/a/766996/1432614