65

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

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

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

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

有人知道导入我的数据库文件吗?

4

12 回答 12

152

您可以将正则表达式应用于您导出的 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));
于 2017-02-03T17:35:01.700 回答
107

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

于 2018-03-28T21:01:46.907 回答
26

我今天遇到了同样的问题。以下是我的案例的调查结果,

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

于 2019-01-28T15:08:25.543 回答
10

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

vi xxxx.sql
:%s/\(X'[^,\)]*'\)/CONVERT(\1 using utf8mb4)/g
于 2019-07-05T02:25:13.467 回答
9

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

出口前

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

然后导入后

alter table <table> modify <json_column> json;
于 2017-06-12T14:07:39.643 回答
6

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

于 2019-06-04T21:11:24.670 回答
2

我在转储时遇到了这个问题。我能够通过更改转储文件中的行来修复它:

/*!40101 SET NAMES binary*/;

/*!40101 SET NAMES utf8mb4*/;
于 2019-01-11T20:44:01.967 回答
1

Lorcan 的回答确实对我很有帮助,但是转换所有二进制值会产生一堆其他错误消息,例如Duplicate entry [...] for key 'PRIMARY'. 最后我发现 JSON 条目都以 5B 或 7B 开头,并以 5D 或 7D 结尾,这当然意味着它们以 or 开头并以[or{结尾。所以对我有用的是正则表达式只替换那些条目:]}

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

然后

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

等等,所有导入错误都消失了!(至少对我来说)

于 2020-11-09T19:41:49.200 回答
0

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

于 2018-07-26T10:39:20.763 回答
0

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

于 2019-01-21T12:57:21.330 回答
0

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

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

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

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

于 2019-06-10T21:10:06.503 回答
-5

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

于 2016-06-28T14:12:42.127 回答