h1

Illegal mix of collations en procedimiento almacenado de MySQL

23 marzo 2010

En el trabajo he tenido que modificar el modelo de una base de datos MySQL para un proyecto ya casi terminado (benditos lusers que no saben cómo hacen lo que hacen), por lo que creé un par de procedimientos almacenados. En mi equipo funcionaban perfectamente, pero al probarlo en otro no hacía más que mostrar el error:

ERROR 1267 (HY000): Illegal mix of collations (utf8_spanish_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='

El único punto del procedimiento donde podía ocurrir era en un where donde se comparaban dos longtext:

select id into errorid from errortecnico
where mensaje = errormensaje

Buscando y buscando encontré la inspiración en el blog de Pablo Viquez, un desarrollador de Costa Rica, con la única diferencia de que su problema ocurría con la codificación latin1.

La solución es convertir la parte del where que causa problemas a la collation (dentro de una codificación, la ordenación de caracteres) que nosotros usamos mediante la sentencia convert, que en mi caso quedaría tal que así:

select id into errorid from errortecnico where mensaje
= CONVERT(errormensaje using utf8) collate utf8_spanish_ci

Con esto, MySQL convertirá automáticamente el dato que interpretaba como utf8_general_ci a utf8_spanish_ci.

7 comentarios

  1. […] .Articulo Indexado en la Blogosfera de Sysmaya […]


  2. Gracias, me sirvio de mucho! tenia el mismo problema:
    CALL sp_listaUsuarioXLogin(‘root’);
    DELIMITER $$

    DROP PROCEDURE IF EXISTS `sp_listaUsuarioXLogin`$$

    CREATE PROCEDURE `sp_listaUsuarioXLogin`(IN varLogin VARCHAR(50))
    BEGIN

    — set varLogin= co(varLogin , utf8_spanish_ci);
    SELECT u.idusuario,u.login,u.pass,u.nombre,u.apellido,u.idpais,ur.tipo FROM usuarios u,
    usuario_reporte ur
    WHERE u.idusuario=ur.idusuario AND ur.tipo=1
    AND STRCMP(u.login,CONVERT(varLogin USING utf8) COLLATE utf8_spanish_ci)=0 ;
    END$$

    DELIMITER ;


  3. Pequeña errata; donde dice:

    ut8_spanish_ci

    debe decir:

    utf8_spanish_ci


    • Corregido, ¡muchas gracias!


  4. buena solución. gracias!


  5. Muchas gracias.. era lo que necesitaba para solucionar el problema.



Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: