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

时间:2016-06-28 13:51:03

标签: mysql json import mysql-json

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

  

无法使用CHARACTER SET' binary'

从字符串创建JSON值

在stackoverflow上,我找到了这篇文章,但对我没有用: mysqlimport issues "set @@character_set_database=binary" which prevents loading json values

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

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

12 个答案:

答案 0 :(得分:97)

您可以将正则表达式应用于导出的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));

答案 1 :(得分:68)

我遇到了Sequel Pro出口的问题。我取消选中了Output BLOB fields as hex选项,问题就消失了。目视检查导出显示清晰的JSON而不是二进制。

答案 2 :(得分:13)

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

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

答案 3 :(得分:5)

这对我有用,(我也控制了对sql文件的导出)。有很多警告;例如我知道这些字段永远不会超过1000,并且不会包含任何非ascii字符。 请做评论并告诉我所有这些是如此糟糕的事情:)

出口前

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

然后导入

alter table <table> modify <json_column> json;

答案 4 :(得分:0)

将排序规则更改为utf8_general_ci。为我工作。

答案 5 :(得分:0)

我在转储时遇到了这个问题。我能够通过以下方式更改转储文件中的行来解决此问题:

/*!40101 SET NAMES binary*/;

/*!40101 SET NAMES utf8mb4*/;

答案 6 :(得分:0)

对于像我这样使用Symfony 4 / Doctrine到达这里的人:由于某些原因,可以在存储JSON的长文本MySQL类型中解析相同的实体。或存储json的json MySQL类型。在我的特殊情况下,手动设置长文本MySQL类型可以解决该问题。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

运行简单的UPDATE查询时出现了这个奇怪的问题:

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

重启MySQL修复了它。无法查明原因。

编辑:我们正在使用Aurora。看来这与我们的配置很奇怪有关,其中相同的实例同时处理主和从/读器连接。

答案 9 :(得分:0)

vim版本供Lorcan O'Neill解答

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

答案 10 :(得分:0)

Lorcan's的答案确实对我有帮助,但是转换 all 二进制值会产生很多其他错误消息,例如Duplicate entry [...] for key 'PRIMARY'。最终,我发现JSON条目均以5B或7B开头,以5D或7D结束,这当然意味着它们以[{开头,以]或{{ 1}}。所以对我有用的是仅对这些条目进行正则表达式替换:

}

然后

Find:    (X'5B[^,\)]*5D')
Replace: CONVERT($1 using utf8mb4)

等等,所有导入错误都消失了! (至少就我而言)

答案 11 :(得分:-3)

所有MySQL JSON数据类型信息必须是UTF8MB4字符集而不是BINARY。