проблема
Я использую встроенную функцию FIND_IN_SET с переменной @myVar для списка строк, например:
FIND_IN_SET(col, @myVar)
Если я установлю @myVar из прямого значения :
SET @myVAr = 'one,two,three';
... FIND_IN_SET(col, @myVar)
=> Отлично работает
Если я установлю @myVar из функции, возвращающей объединенные значения из одного столбца таблицы :
SET @myVAr = '';
SELECT @myVAr := getStringOfValues();
... FIND_IN_SET(col, @myVar)
=> Я получаю Ошибка SQL (1267): недопустимое сочетание параметров сортировки (utf8_unicode_ci, IMPLICIT) и (utf8_general_ci, IMPLICIT) для операции 'find_in_set'
Итак, я должен избавиться от этой ошибки?
Важно отметить, что я не хочу менять параметры сортировки моей таблицы. Хотелось бы изменить параметры сортировки моей переменной, чтобы она соответствовала параметрам сортировки моего столбца, но я не могу принудительно установить это с ключевым словом "COLLATE" во время его инициализации:
SET @myVar= '' COLLATE utf8_unicode_ci;
=> Я получаю Ошибка SQL (1253): COLLATION 'utf8_unicode_ci' недопустим для CHARACTER SET 'utf8mb4'
Полезная информация
Все мои таблицы и их столбцы имеют параметры сортировки utf8_unicode_ci
SHOW VARIABLES LIKE '%char%'
character_set_client = utf8mb4
character_set_connection = utf8mb4
character_set_database = utf8
character_set_filesystem = binary
character_set_results = utf8mb4
character_set_server = latin1
character_set_system = utf8
SHOW VARIABLES LIKE 'coll%'
collation_connection = utf8mb4_general_ci
collation_database = utf8_general_ci
collation_server = latin1_swedish_ci
SHOW CREATE FUNCTION getStringOfValues
character_set_client = utf8mb4
collation_connection = utf8m4_general_ci
Сортировка базы данных = utf8_general_ci
Код SQL (анонимная и упрощенная версия)
-- Function to return as a string the result from a SELECT in my_table_1
DELIMITER $$
CREATE FUNCTION getStringOfValues()
RETURNS TEXT
-- Variables to build the string of values
DECLARE curr_value VARCHAR(255) DEFAULT '';
DECLARE string_of_values TEXT DEFAULT '';
-- Variables to enter and exit the loop over values
DECLARE done INT DEFAULT 0;
DECLARE my_cursor CURSOR FOR SELECT col FROM my_table_1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN my_cursor;
my_loop:LOOP
FETCH my_cursor INTO curr_value;
IF done THEN
LEAVE my_loop;
ELSE
SET string_of_values = CONCAT(curr_value, ',', string_of_values);
END IF;
END LOOP;
CLOSE my_cursor;
-- Remove the trailing comma and quote the string. Result in something like 'one,two,three'
RETURN QUOTE(TRIM(TRAILING ',' FROM string_of_values));
$$
DELIMITER ;
SET @myVAr = 'one,two,three';
-- The statement below will WORK
SELECT * FROM my_table_2 WHERE FIND_IN_SET(col, @myVAr);
SELECT @myVAr := getStringOfValues();
-- The statement below will NOT WORK as there is a 'Illegal mix of collations'
SELECT * FROM my_table_2 WHERE FIND_IN_SET(col, @myVAr);