Mysql 5.7.20:无法从具有 CHARACTER SET 'binary' 的字符串创建 JSON 值
Posted
技术标签:
【中文标题】Mysql 5.7.20:无法从具有 CHARACTER SET \'binary\' 的字符串创建 JSON 值【英文标题】:Mysql 5.7.20: Cannot create a JSON value from a string with CHARACTER SET 'binary'Mysql 5.7.20:无法从具有 CHARACTER SET 'binary' 的字符串创建 JSON 值 【发布时间】:2018-07-09 15:05:01 【问题描述】:在导入带有 JSON 列的表的 SQL 文件时,我遇到了这个问题。
数据库有
编码:utf8mb4
整理:utf8mb4_unicode_ci
这是带有 json 列的表:
CREATE TABLE `tracking_data` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`route` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`data` json NOT NULL,
`user_id` int(10) unsigned NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
我已阅读此question 关于堆栈溢出的答案,这表明该表必须位于utf8mb4
。我的已经,但我仍然面临这个问题。
仍然抛出这个错误:
第 XXX 行:无法从具有 CHARACTER SET 的字符串创建 JSON 值 '二进制'。
当我运行show session variables like 'char%';
:
Variable_name Value
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8mb4
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/
我该如何解决这个问题? 谢谢!
【问题讨论】:
【参考方案1】:如果我的会话字符集是binary
,我可以重现你的错误:
mysql [localhost] msandbox (test) > set names binary;
Query OK, 0 rows affected (0.00 sec)
mysql [localhost] msandbox (test) > insert into tracking_data (route, data, user_id) values ('route', '"route": "value"', 1);
ERROR 3144 (22032): Cannot create a JSON value from a string with CHARACTER SET 'binary'.
然后我可以通过设置会话字符集来匹配表来修复它:
mysql [localhost] msandbox (test) > set names utf8mb4;
Query OK, 0 rows affected (0.00 sec)
mysql [localhost] msandbox (test) > insert into tracking_data (route, data, user_id) values ('route', '"route": "value"', 1);
Query OK, 1 row affected (0.01 sec)
所以我断定您已将会话字符集设置为binary
。
运行show session variables like 'char%';
,看看它告诉你什么。
【讨论】:
嗨@Bill Karwin 当我运行show session variables like 'char%';
时,回复如下:
``` 变量名值 character_set_client utf8mb4 character_set_connection utf8mb4 character_set_database utf8mb4 character_set_filesystem binary character_set_results utf8mb4 character_set_server latin1 character_set_system utf8 character_sets_dir /usr/share/mysql/charsets/ ```
当我尝试从文件导入时,我仍然遇到这个问题。
在您尝试导入的会话中,其中一些会话变量可能不同。
我该如何解决?【参考方案2】:
我今天遇到了同样的问题。以下是我的案例的调查结果,
我让我的一位朋友生成一个 SQL 转储供我导入。他使用sequel-pro
生成转储(导出数据库)。当我进行导入时,它抛出了一个错误 Cannot create a JSON value from a string with CHARACTER SET 'binary'
因此,生成的转储存在问题,所有 json
字段都被转换为某种原始格式,即不是 value
"'key1':'value1', 'key2':'value2'"
它是,
X'nfdsklsdsklnfjkbvkjsdbvkjhdfsbvkjdsbnvljkdsbvkjhdfbvkjdfbvjkdfb'
因此,当导入转储时,即运行 insert
语句 mysql
无法处理数据,因为它不是 json
类型。
这是报告的错误的链接https://github.com/sequelpro/sequelpro/issues/2397
【讨论】:
谢谢。我会尝试 phpmyadmin 或其他东西,并会让你知道以上是关于Mysql 5.7.20:无法从具有 CHARACTER SET 'binary' 的字符串创建 JSON 值的主要内容,如果未能解决你的问题,请参考以下文章
在CentOS 7问题(很多)中编译MySQL 5.7.20
Mysql 5.7.20 mysql innodb 系统表损坏带来的问题