我导出了包含JSON列的数据库。迁移到新服务器后,我的导入每次都崩溃,出现如下错误:
无法使用CHARACTER SET' binary'
从字符串创建JSON值
在stackoverflow上,我找到了这篇文章,但对我没有用: mysqlimport issues "set @@character_set_database=binary" which prevents loading json values
该文件为2GB,无法打开该文件。
任何人都有想法导入我的数据库文件吗?
答案 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。