En écrivant une procédure stockée pour le boulot, je me suis retrouvé avec un merveilleux :

1267 – Illegal mix of collations (latin1_general_cs,IMPLICIT) and (latin1_swedish_ci,IMPLICIT)

Avec 5 procédures stockées et plusieurs centaines de lignes de SQL, les messages d’erreur de Mysql sont toujours aussi précis…. 🙂

Après avoir passé un peu de temps à chercher, j’ai trouvé d’où ça venait. Dans une procédure stockée, je déclarais un varchar :

[sql]DECLARE _Product_Edition varchar(50);[/sql]

Que j’essayais de comparer dans une requête :

[sql]INSERT INTO client_date
SELECT
[…]
FROM
t_log
WHERE
[…]
t_log.lg_ToType = _Product_Edition
[…]
;[/sql]
Le problème c’est que la colonne est de type latin1_general_cs et que la variable est déclarée implicitement en latin1_swedish_ci, forcément ça coince. Bien sûr en dehors d’une procédure stockée ça marche…

La solution est un peu exotique, il s’agit de convertir la variable en latin1_general_ci :

[sql]set @_Product_Edition = _Product_Edition collate latin1_general_cs;[/sql]

Puis d’exécuter la requêtre.. autrement :

[sql]SET @sql_text = CONCAT(‘INSERT INTO client_date
SELECT
[…]
FROM
t_log
WHERE
[…]
t_log.lg_ToType = @_Product_Edition
[…]’)
;[/sql]

[sql]prepare stmt from @sql_text ;
execute stmt;
deallocate prepare stmt[/sql]

Après ça, plus de sushis… 🙂