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.