MySQL 5.7.12导入无法从CHARACTER SET'binary'的字符串创建JSON值

Dan*_*ers 42 mysql import json mysql-json

我在其中导出了包含JSON列的数据库.迁移到新服务器后,我的导入每次都崩溃,出现如下错误:

无法从CHARACTER SET'binary'的字符串创建JSON值

在stackoverflow上,我找到了这篇文章,但对我来说不起作用: mysqlimport发出"set @@ character_set_database = binary",这会阻止加载json值

该文件为2GB,无法打开该文件.

任何人都有想法导入我的数据库文件?

Lor*_*ill 108

您可以将正则表达式应用于导出的SQL文本,该文本将二进制字符串转换为可插入格式.当我遇到这个问题时,这是我快速而又肮脏的修复

(X'[^,\)]*')
CONVERT($1 using utf8mb4)
Run Code Online (Sandbox Code Playgroud)

应用此正则表达式意味着

INSERT INTO json_table (json_column) VALUES (X'7B22666F6F223A2022626172227D');
Run Code Online (Sandbox Code Playgroud)

现在将成为

INSERT INTO json_table (json_column) VALUES (CONVERT(X'7B22666F6F223A2022626172227D' using utf8mb4));
Run Code Online (Sandbox Code Playgroud)

  • 对于grins,这里是非inplace"sed"版本:`sed -E"s /(X'[^,\)]*')/ CONVERT(\ 1使用utf8mb4)/ g"infile.sql> outfile.sql ` (53认同)
  • Ray注释中的正则表达式不适用于我,因此我必须使用以下正则表达式:`sed -E“ s /(0x'[^,\)] *')/ CONVERT(\ 1 using utf8mb4)/ g” infile .sql> outfile.sql` (2认同)

Hen*_*nry 80

我有这个问题处理Sequel Pro的出口.我取消选中该Output BLOB fields as hex选项,问题就消失了.目视检查导出显示清晰的JSON而不是二进制.

  • 试过这个,但有些领域引用了.Sequel Pro导出将其视为`\"`,但这应该是`\\"`.所以基本上:如果你的JSON数据中有引号,那么你对Sequel Pro的运气不好. (11认同)
  • 谢谢。我只是希望 Sequel Pro 能够得到更新。 (4认同)
  • 谢谢!你救了我的一天(:干杯! (3认同)

swa*_*ina 18

我今天也面临着同样的问题。以下是我的案例的发现,

我请一位朋友生成一个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选项。


小智 10

vim 版本对于 Lorcan O'Neill 的回答

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


小智 6

这对我有用(我也控制了到sql文件的导出)。有很多警告。例如,我知道这些字段永远不会大于1000,并且不包含任何非ascii字符。请发表评论,并告诉我所有为什么这样糟糕的原因:)

出口前

alter table <table> modify <json_column> varchar(1000);
Run Code Online (Sandbox Code Playgroud)

然后导入

alter table <table> modify <json_column> json;
Run Code Online (Sandbox Code Playgroud)


Pet*_*ter 5

对于那些在 2019 年 6 月左右使用 Sequel Pro 的用户,除了取消选中“将 BLOB 字段输出为十六进制选项”(如上所述)之外,您还需要使用夜间构建,它在 2 年前增加了对 JSON 类型的支持。此支持尚未正式发布。