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.