SQL - «Недопустимое сочетание параметров сортировки» при использовании переменной в функции FIND_IN_SET - PullRequest
1 голос
/ 24 мая 2019

проблема

Я использую встроенную функцию 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);
...