Saltar al contenido

Mezcla ilegal de intercalaciones (utf8_unicode_ci,IMPLICIT) y (utf8_general_ci,IMPLICIT) para la operación ‘=’

Esta noticia fue analizado por expertos así garantizamos la veracidad de este ensayo.

Solución:

La intercalación predeterminada para los parámetros de procedimientos almacenados 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);

opcion 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 la IN definición de parámetro:

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á ligeramente la ordenación.

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

Pasé medio día buscando respuestas a un error idéntico de “Combinación ilegal de colaciones” con conflictos entre utf8_unicode_ci y utf8_general_ci.

Descubrí que algunas columnas en mi base de datos no se cotejaron específicamente utf8_unicode_ci. Parece que mysql cotejó implícitamente estas columnas utf8_general_ci.

Específicamente, ejecutar una consulta ‘MOSTRAR CREAR TABLA table1’ generó algo como lo siguiente:

| table1 | CREATE TABLE `table1` (
`id` int(11) NOT NULL,
`col1` varchar(4) CHARACTER SET utf8 NOT NULL,
`col2` int(11) NOT NULL,
PRIMARY KEY (`col1`,`col2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

Tenga en cuenta la línea ‘col1’ varchar(4) CONJUNTO DE CARACTERES utf8 NO NULO no tiene una intercalación especificada. Luego ejecuté la siguiente consulta:

ALTER TABLE table1 CHANGE col1 col1 VARCHAR(4) CHARACTER SET utf8
COLLATE utf8_unicode_ci NOT NULL;

Esto resolvió mi error “Mezcla ilegal de intercalaciones”. Espero que esto pueda ayudar a alguien más por ahí.

Tuve un problema similar, pero se me ocurrió dentro del procedimiento, cuando mi parámetro de consulta se configuró usando una variable, por ejemplo SET @value='foo'.

Lo que estaba causando esto no coincidía collation_connection y recopilación de bases de datos. Cambió collation_connection hacer coincidir collation_database y el problema se fue. Creo que este es un enfoque más elegante que agregar COLLATE después de param/value.

En resumen: todas las intercalaciones deben coincidir. Utilizar SHOW VARIABLES y asegúrate collation_connection y collation_database coincidencia (también verifique la intercalación de la tabla usando SHOW TABLE STATUS [table_name]).

Si para ti ha sido útil nuestro post, agradeceríamos que lo compartas con el resto desarrolladores así contrubuyes a extender esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *