not - mysql utf8
Mezcla ilegal de intercalaciones(utf8_general_ci, IMPLICIT) y(utf8_unicode_ci, IMPLICIT) dentro del procedimiento almacenado (4)
Resolví mi problema, y era debido a una conversión incorrecta durante la migración, estaba convirtiendo a utf_general_ci en lugar de utf8_unicode_ci, así que aunque la estructura de la base de datos mysql era correcta, los datos de origen estaban codificados en la codificación incorrecta (utf8_general_ci) e insertados en mysql ddbb de esa manera.
Entonces, el hecho es que puede tener el conjunto de caracteres y la intercalación correctos en su base de datos mysql y aún así obtener este error de "mezcla ilegal de intercalaciones", debido a que los datos se codifican con otra intercalación.
Espero que esto ayude a alguien en el futuro.
Todas las tablas están en
utf_unicode_ci
.He hecho esto para verificar
SELECT table_schema, table_name, column_name, character_set_name, collation_name FROM information_schema.columns WHERE collation_name <> ''utf8_unicode_ci'' AND table_schema LIKE ''my_database'' ORDER BY table_schema, table_name, ordinal_position;
Y convirtió todas las tablas por si acaso
ALTER TABLE `my_database`.`table_name` DEFAULT COLLATE utf8_unicode_ci; ALTER TABLE `my_database`.`table_name` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
La configuración de intercalación de mi base de datos está en
utf8_unicode_ci
.Los conjuntos son
mysql> show variables like ''char%''; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.02 sec)
las intercalaciones son
mysql> show variables like ''colla%''; +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_unicode_ci | | collation_database | utf8_unicode_ci | | collation_server | utf8_unicode_ci | +----------------------+-----------------+ 3 rows in set (0.00 sec)
el error se activa si llamo al procedimiento almacenado a través del navegador web o a través del cliente mysql bash. en caso de que mi configuración de ubuntu / linux locale sea:
$ locale LANG=es_ES.UTF-8 LANGUAGE=es_ES.UTF-8 LC_CTYPE=es_ES.UTF-8 LC_NUMERIC="es_ES.UTF-8" LC_TIME="es_ES.UTF-8" LC_COLLATE=es_ES.UTF-8 LC_MONETARY="es_ES.UTF-8" LC_MESSAGES=es_ES.UTF-8 LC_PAPER="es_ES.UTF-8" LC_NAME="es_ES.UTF-8" LC_ADDRESS="es_ES.UTF-8" LC_TELEPHONE="es_ES.UTF-8" LC_MEASUREMENT="es_ES.UTF-8" LC_IDENTIFICATION="es_ES.UTF-8" LC_ALL=
La única forma en que he podido resolver este problema es usando convert
dentro de cada consulta que causa el error (o usando COLLATE
dentro de la consulta), pero el problema es que hay muchos procedimientos almacenados bastante complejos, por lo que es difícil identificarlos las consultas "malas" y toma mucho tiempo.
Supongo que de alguna manera las variables pasadas al procedimiento almacenado desde mi sistema (ubuntu: cliente mysql, navegador), se envían en utf8_general_ci, por lo que hace conflicto con ut8_unicode_ci de mi base de datos.
Parece que el sistema operativo está trabajando con utf8_general_ci aunque la conexión de mysql está establecida en utf_unicode_ci.
Volver a importar los procesos almacenados y las funciones almacenadas una vez que tenga la configuración de codificación y clasificación correcta resolverá los problemas. Se encontró con el mismo problema exacto. Otra útil función nativa de mysql para la resolución de problemas: seleccione intercalación (some_col) de some_table, si sospecha que hay problemas con el formato de datos de su tabla.
He resuelto mi problema después de agregar el CHARSET utf8 en una lista de parámetros. puede ser que esto ayude a otros,
PROCEDURE `USP_USR_AuthenticateUser`(
IN ip_username VARCHAR(50) CHARSET utf8**,
IN ip_pwd NVARCHAR(256)
)
en caso de que ayude a alguien, tuvimos el mismo error al hacer una consulta en diferentes bases de datos de diferentes servidores, el que tenía el error era una migración desde el otro. En nuestro caso, se solucionó cambiando el "servidor_colación" en mysql.ini y reiniciando el servicio mysql.