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 系统表损坏带来的问题

CentOS 7.4使用yum源安装MySQL 5.7.20

mysql5.7:安装教程

MySql安装及无法启动问题解决

linux 安装MySql 5.7.20