Miałem podobny problem, próbowałem użyć procedury FIND_IN_SET ze zmienną łańcuchową .
SET @my_var = 'string1,string2';
SELECT * from my_table WHERE FIND_IN_SET(column_name,@my_var);
i otrzymywał błąd
Kod błędu: 1267. Nielegalna mieszanka zestawień (utf8_unicode_ci, IMPLICIT) i (utf8_general_ci, IMPLICIT) dla operacji „find_in_set”
Krótka odpowiedź:
Nie trzeba zmieniać żadnych zmiennych collation_YYYY, wystarczy dodać poprawne sortowanie obok deklaracji zmiennych , tj
SET @my_var = 'string1,string2' COLLATE utf8_unicode_ci;
SELECT * from my_table WHERE FIND_IN_SET(column_name,@my_var);
Długa odpowiedź:
Najpierw sprawdziłem zmienne sortowania:
mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
+----------------------+-----------------+
| collation_database | utf8_general_ci |
+----------------------+-----------------+
| collation_server | utf8_general_ci |
+----------------------+-----------------+
Następnie sprawdziłem zestawienie tabel:
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;
Oznacza to, że moja zmienna została skonfigurowana z domyślnym zestawieniem utf8_general_ci, podczas gdy moja tabela została skonfigurowana jako utf8_unicode_ci .
Dodając polecenie COLLATE obok deklaracji zmiennej, sortowanie zmiennych pasowało do sortowania skonfigurowanego dla tabeli.