【问题标题】: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/ 

我该如何解决这个问题? 谢谢!

【问题讨论】:

    标签: mysql json mysql-5.7


    【解决方案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 或其他东西,并会让你知道
    猜你喜欢
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 2013-05-17
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    相关资源
    最近更新 更多