2 votes

Mélange illégal des collations (utf8mb4_general_ci,COERCIBLE) et (latin1_swedish_ci,IMPLICIT) pour l'opération '='

Lorsque j'exécute la procédure suivante

call clean_email('johnny@c.com');

J'obtiens l'erreur suivante Mélange illégal des collations (utf8mb4_general_ci,COERCIBLE) et (latin1_swedish_ci,IMPLICIT) pour l'opération '='.

J'ai essayé de modifier les collations pour les applications de table, mais l'erreur ne se résout toujours pas. Que puis-je faire pour résoudre ce problème ? Dois-je modifier la procédure ?

CREATE DEFINER=`root`@`%` PROCEDURE `clean_email`(_email_ varchar(128))
this_proc : BEGIN
    declare _appId                bigint unsigned;
    /*TEMP*/  declare _resumeId    bigint unsigned;
    DECLARE done INT DEFAULT FALSE;

    DECLARE cursor_i CURSOR FOR 
        /*TEMP*/  (SELECT appId, null as "resumeId" FROM _appendix WHERE lower(`value`) = lower(_email_) AND lower(`key`)="applicantemail")
        -- LATER -- andOr /*TEMP*/  UNION
        -- LATER -- (SELECT id 
        -- LATER -- andOr /*TEMP*/, resumeId
        -- LATER -- FROM cbax_application WHERE lower(`name`)  =  lower(_email_))
        ;
    /*TEMP*/ DECLARE cursor_old CURSOR FOR select id from applications where 
        /*TEMP*/ CASE WHEN formData is null OR trim(formData)="" THEN false ELSE 
        /*TEMP*/ lower(JSON_UNQUOTE(JSON_EXTRACT(CONVERT(formData using utf8mb4),'$.candidateParams.ApplicantEmail'))) = lower(_email_) END;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
    BEGIN
        GET DIAGNOSTICS CONDITION 1 @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
        ROLLBACK;
        select "Failed" as "status", @p1 as "sql_state", @p2 as "message_text";
    END;

    -- ---------------------
    -- Input Validations --
    IF(_email_ IS NULL or instr(_email_,"@") < 2) THEN
        select "Failed" as "status", 0 as "sql_state", "Email id is required." as "message_text";
        LEAVE this_proc;
    END IF;
    -- END Input Validations --
    -- ------------------------

    START TRANSACTION;
        OPEN cursor_i;
        read_loop: LOOP
            FETCH cursor_i INTO _appId
            /*TEMP*/, _resumeId
            ;
            IF done THEN
                LEAVE read_loop;
            END IF;

            DELETE FROM cbax_application WHERE id = _appId;
            DELETE FROM cbax_application_blob WHERE appId = _appId;
            DELETE FROM job_info WHERE appId = _appId;
            DELETE FROM `resume` WHERE id = _resumeId;
            -- LATER -- DELETE FROM _values WHERE appId = _appId;
            -- LATER -- DELETE FROM _letter WHERE appId = _appId;
            -- LATER -- DELETE FROM _history WHERE appId = _appId;

            /*TEMP*/ DELETE FROM _appendix WHERE appId = _appId;
        END LOOP;
        CLOSE cursor_i;

        /*START TEMP*/
            SET done = FALSE;
            OPEN cursor_old;
            old_loop: LOOP
                FETCH cursor_old INTO _appId;
                IF done THEN
                    LEAVE old_loop;
                END IF;

                DELETE FROM applications WHERE id = _appId;
                DELETE FROM _values WHERE appId = _appId;
                DELETE FROM_letter WHERE appId = _appId;
                DELETE FROM _history WHERE appId = _appId;
            END LOOP;
            CLOSE cursor_old;
        /*END TEMP*/

        select "Success" as "status";
    COMMIT;
END

enter image description here

1voto

Rick James Points 15994

Faire SHOW CREATE PROCEDURE clean_email; mais regardez les colonnes supplémentaires autres que le corps du code. L'une d'entre elles indique que le CHARACTER SET utilisé lorsque créer le proc. Il est probable qu'il dise latin1 .

Pour changer cela,

SET NAMES utf8mb4;   -- assuming this is desired
DROP PROCEDURE clean_emaill;
and recreate the procedure

1voto

ralf htp Points 3887

SQL est pointilleux en ce qui concerne l'interaction entre le jeu de caractères et la collation. C'est également le cas dans Collation MySQL : latin1_swedish_ci Vs utf8_general_ci .

Remplacer CHARSET par utf8_swedish_ci : DEFAULT CHARACTER SET = utf8_swedish_ci

Lorsque l'on utilise des jeux de caractères et des collations "incompatibles", on essaie de comparer des "pommes et des poires" :

Un jeu de caractères est un ensemble de symboles et d'encodages. Une collation est un ensemble de règles permettant de comparer les caractères d'un jeu de caractères.

source : https://dev.mysql.com/doc/refman/8.0/en/charset-general.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X