我导出了我的数据库,其中包含 JSON 列。迁移到新服务器后,每次导入都会崩溃,并出现如下错误:
无法从具有 CHARACTER SET 'binary' 的字符串创建 JSON 值
在stackoverflow上,我找到了这篇文章,但对我没有用: mysqlimport issues "set @@character_set_database=binary" which prevent loading json values
该文件为 2GB,无法打开该文件。
有人知道导入我的数据库文件吗?
我导出了我的数据库,其中包含 JSON 列。迁移到新服务器后,每次导入都会崩溃,并出现如下错误:
无法从具有 CHARACTER SET 'binary' 的字符串创建 JSON 值
在stackoverflow上,我找到了这篇文章,但对我没有用: mysqlimport issues "set @@character_set_database=binary" which prevent loading json values
该文件为 2GB,无法打开该文件。
有人知道导入我的数据库文件吗?
您可以将正则表达式应用于您导出的 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));
我在处理 Sequel Pro 的导出时遇到了这个问题。我取消选中该Output BLOB fields as hex选项,问题就消失了。目视检查导出显示清晰的 JSON 而不是二进制文件。
我今天遇到了同样的问题。以下是我的案例的调查结果,
我让我的一位朋友生成一个 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选项。
vim 版本对于 Lorcan O'Neill 的回答
vi xxxx.sql
:%s/\(X'[^,\)]*'\)/CONVERT(\1 using utf8mb4)/g
这对我有用,(我也可以控制导出到 sql 文件)。有很多警告;例如,我知道这些字段永远不会大于 1000,并且不会包含任何非 ascii 字符。请发表评论并告诉我所有为什么这太糟糕了:)
出口前
alter table <table> modify <json_column> varchar(1000);
然后导入后
alter table <table> modify <json_column> json;
对于那些在 2019 年 6 月左右使用 Sequel Pro 的人,除了取消选中“将 BLOB 字段作为十六进制选项”(如上所述)之外,您还需要使用每晚构建,它在 2 年前增加了对 JSON 类型的支持。此支持尚未发布到正式版本。
我在转储时遇到了这个问题。我能够通过更改转储文件中的行来修复它:
/*!40101 SET NAMES binary*/;
到
/*!40101 SET NAMES utf8mb4*/;
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)
等等,所有导入错误都消失了!(至少对我来说)
将排序规则更改为 utf8_general_ci。为我工作。
对于像我这样使用 Symfony 4 / Doctrine 来到这里的人:由于某些原因,可以在存储 JSON 的长文本 MySQL 类型中解析相同的实体;或存储 json 的 json MySQL 类型。在我的特殊情况下,手动设置 longtext MySQL 类型解决了这个问题。
运行简单的 UPDATE 查询时出现了这个奇怪的问题:
update some_table set json_attr = '{"test":168}' where id = 123456;
重新启动 MySQL 修复它。无法查明原因。
编辑:我们正在使用 Aurora。看起来这与我们有一个奇怪的配置有关,其中同一个实例同时处理了主从/读卡器连接。
所有 MySQL JSON 数据类型信息必须是 UTF8MB4 字符集而不是 BINARY。