MySQL Ошибка 1366 при преобразовании JSON в текст с определенными символами - PullRequest
1 голос
/ 08 апреля 2020

ОБНОВЛЕНИЕ: Ниже приведена дополнительная информация, показывающая, как ТЕКСТ ведет себя иначе, чем 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 был кошмаром для работы, когда дело доходит до сопоставления и проблем с символами. Я остаюсь, почесывая голову от этого. Кроме того, если этот символ вызывает ошибку при назначении переменной, какие другие символы будут делать то же самое?

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 15 апреля 2020

Проблема заключалась в кодировании моего соединения. Я использовал по умолчанию -> Текущий Windows Кодовая страница. Когда я переключился на utf8mb4 -> Unicode (UTF-8), проблема исчезла. Что очень странно, так это то, что сбой происходил в очень сложных хранимых процедурах, которые все вызывали друг друга; почему он использовал кодировку соединения, я не знаю, так как сервер / система выполнял вызовы, и его кодировка установлена ​​правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...