ОБНОВЛЕНИЕ: Ниже приведена дополнительная информация, показывающая, как ТЕКСТ ведет себя иначе, чем JSON и глобальные переменные с теми же данными. Еще более странно, CHARSET и COLLATION переменных var_ json и @ var_char1 являются ТОЧНЫМИ ЖЕ, как переменная TEXT (utf8mb4 / utf8mb4_unicode_ci).
DECLARE var_char text;
DECLARE var_json json;
-- The CHARSET and COLLATION of var_char is utf8mb4 and utf8mb4_unicode_ci
SET var_json = '{"This": "• ® is a test"}'; -- Works Fine
SET @var_char1 = 'This • ® is a test'; -- Works Fine
SET var_char = 'This • ® is a test'; -- ERROR 1366 \x95 \xAE
SET var_char = CONVERT('This • ® is a test' USING utf8); -- Replaces specials with ? ? and works
SET var_char = CONVERT('This • ® is a test' USING utf8mb4); -- returns NULL ?!
Почему переменная TEXT не принимает и оставить специальные символы, когда он использует тот же набор символов / сопоставление, что и глобальные переменные / JSON, которые сохраняют его в порядке?
===
У меня возникла проблема, когда я должен извлечь JSON куски и преобразовать их в строки TEXT для внутренней обработки; проблема в том, что MySQL задыхается из-за ошибки 1366 для простых символов, таких как • (/ x95). Если я использую глобальную переменную, это не проблема (например, @var, а не var TEXT); похоже, это происходит только с переменными TEXT.
Моя кодировка: utf8mb4 Моя сортировка: utf8mb4_unicode_ci Моя SQL версия: 8.0.18 Среда: Windows 10
Код ниже всегда выдает: Код ошибки: 1366. Неверное строковое значение: '\ x95' для столбца 'var_char' в строке 1
CREATE DEFINER = 'root'@'localhost'
PROCEDURE empowercrm_main.test_proc()
BEGIN
DECLARE var_char text;
set var_char = '•';
END
Обратите внимание: если я использую переменную GLOBAL (например, @var_char), она работает нормально. Но мне не нужно использовать глобальную переменную, чтобы сделать это!
MySQL был кошмаром для работы, когда дело доходит до сопоставления и проблем с символами. Я остаюсь, почесывая голову от этого. Кроме того, если этот символ вызывает ошибку при назначении переменной, какие другие символы будут делать то же самое?
Любая помощь будет принята с благодарностью.