J'ai eu un problème similaire, j'essayais d'utiliser la procédure FIND_IN_SET avec une variable de chaîne .
SET @my_var = 'string1,string2';
SELECT * from my_table WHERE FIND_IN_SET(column_name,@my_var);
et recevait l'erreur
Code d'erreur: 1267. Mélange illégal de classements (utf8_unicode_ci, IMPLICIT) et (utf8_general_ci, IMPLICIT) pour l'opération 'find_in_set'
Réponse courte:
Pas besoin de modifier les variables collation_YYYY, ajoutez simplement le classement correct à côté de votre déclaration de variable , c'est-à-dire
SET @my_var = 'string1,string2' COLLATE utf8_unicode_ci;
SELECT * from my_table WHERE FIND_IN_SET(column_name,@my_var);
Longue réponse:
J'ai d'abord vérifié les variables de classement:
mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
+----------------------+-----------------+
| collation_database | utf8_general_ci |
+----------------------+-----------------+
| collation_server | utf8_general_ci |
+----------------------+-----------------+
Ensuite, j'ai vérifié le classement de la table:
mysql> SHOW CREATE TABLE my_table;
CREATE TABLE `my_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`column_name` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=125 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Cela signifie que ma variable a été configurée avec le classement par défaut de utf8_general_ci alors que ma table était configurée comme utf8_unicode_ci .
En ajoutant la commande COLLATE à côté de la déclaration de variable, le classement des variables correspond au classement configuré pour la table.