MySQL 5.7.12 импорт не может создать значение JSON из строки с CHARACTER SET 'binary'

Я экспортировал свою базу данных в колонки JSON. После того, как я перешел на новый сервер, мой импорт разбился каждый раз с ошибкой, например:

не может создать значение JSON из строки с CHARACTER SET 'binary'

В stackoverflow я нашел этот пост, но не работал для меня: mysqlimport issues "set @@character_set_database = binary", который предотвращает загрузку json-значений

Файл имеет размер 2 ГБ и открыть файл невозможно.

У кого-нибудь есть идея импортировать мой файл базы данных?

Ответ 1

Вы можете применить регулярное выражение к тексту SQL, который вы экспортировали, который преобразует ваши двоичные строки в вставленный формат. Это было мое быстрое и грязное решение, когда я столкнулся с этой проблемой

(X'[^,\)]*')
CONVERT($1 using utf8mb4)

Применение этого регулярного выражения означает

INSERT INTO json_table (json_column) VALUES (X'7B22666F6F223A2022626172227D');

теперь станет

INSERT INTO json_table (json_column) VALUES (CONVERT(X'7B22666F6F223A2022626172227D' using utf8mb4));

Ответ 2

У меня была эта проблема, связанная с экспортом Sequel Pro. Я снял флажки Output BLOB fields as hex опцию, и проблема исчезла. Визуальная проверка экспорта показала разборчивый JSON вместо двоичного.

Ответ 3

Я столкнулся с той же проблемой сегодня. Ниже были выводы для моего случая,

Я попросил одного из моих друзей создать дамп SQL для импорта. Он использовал sequel-pro для генерации дампа (экспорт базы данных). Когда я сделал импорт, он выдал ошибку

Cannot create a JSON value from a string with CHARACTER SET 'binary'

Итак, возникла проблема с созданным дампом, все поля json были преобразованы в какой-то необработанный формат, т.е. вместо значения

"{'key1':'value1', 'key2':'value2'}"

это было,

X'nfdsklsdsklnfjkbvkjsdbvkjhdfsbvkjdsbnvljkdsbvkjhdfbvkjdfbvjkdfb'

Таким образом, при импорте дампа, т.е. при выполнении операторов insert mysql не смог обработать данные, так как они не были типа json.

Вот ссылка на сообщенную ошибку
https://github.com/sequelpro/sequelpro/issues/2397

Вам необходимо снять флажок Output BLOB fields as hex вариант.

Ответ 4

Это сработало для меня (я также контролировал экспорт в файл sql). Есть много предостережений; например, я знал, что поля никогда не будут больше 1000 и не будут содержать никаких символов не-ascii. Прошу прокомментировать и рассказать мне все, почему это так плохо. :)

Перед экспортом

alter table <table> modify <json_column> varchar(1000);

Затем после импорта

alter table <table> modify <json_column> json;

Ответ 5

измените порядок сортировки на utf8_general_ci. работал на меня.

Ответ 6

У меня была эта проблема с дампом. я смог это исправить, изменив строку в файле дампа с:

/*!40101 SET NAMES binary*/;

в

/*!40101 SET NAMES utf8mb4*/;

Ответ 7

Для таких, как я, здесь используется Symfony 4/Doctrine: по некоторым причинам одна и та же сущность может быть разрешена в длинном тексте типа MySQL, хранящем JSON; или json-тип MySQL, хранящий json. Ручная установка длинного текста типа MySQL решила проблему в моем конкретном случае.

Ответ 8

Для тех, кто использует Sequel Pro примерно в июне 2019 года, помимо снятия флажка "Выводить поля BLOB как шестнадцатеричный параметр" (как упомянуто выше), вам также необходимо использовать ночную сборку, которая добавила поддержку типов JSON 2 года назад. Эта поддержка еще не дошла до официального релиза.

Ответ 9

Эта странная проблема возникала при выполнении простого запроса UPDATE:

update some_table set json_attr = '{"test":168}' where id = 123456;

Перезапуск MySQL исправил это. Не смог точно определить причину.

Изменение: мы используем Аврора. Похоже, это было связано с тем, что у нас была странная конфигурация, в которой один и тот же экземпляр обрабатывал соединения master и slave/reader.

Ответ 10

vim version Для ответа Лоркана О'Нила

vi xxxx.sql
:%s/\(X'[^,\)]*'\)/CONVERT(\1 using utf8mb4)/g

Ответ 11

Вся информация о типе данных MySQL JSON должна быть UTF8MB4, а не BINARY.