【问题标题】:MySQL 5.7.12 import cannot create a JSON value from a string with CHARACTER SET 'binary'MySQL 5.7.12 导入无法从具有 CHARACTER SET 'binary' 的字符串创建 JSON 值
【发布时间】:2016-10-30 21:26:55
【问题描述】:

我导出了包含 JSON 列的数据库。迁移到新服务器后,每次导入都会崩溃,并出现如下错误:

无法从带有 CHARACTER SET 'binary' 的字符串创建 JSON 值

在 stackoverflow 上,我找到了这篇文章,但对我没有用: mysqlimport issues "set @@character_set_database=binary" which prevents loading json values

文件为 2GB,无法打开。

有人想导入我的数据库文件吗?

【问题讨论】:

    标签: mysql json import mysql-json


    【解决方案1】:

    您可以将正则表达式应用于您导出的 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));
    

    【讨论】:

    • 笑笑,这里是非就地 sed 版本:sed -E "s/(X'[^,\)]*')/CONVERT(\1 using utf8mb4)/g" infile.sql > outfile.sql
    • Ray 评论中的正则表达式对我不起作用,所以我不得不使用以下正则表达式:sed -E "s/(0x'[^,\)]*')/CONVERT(\1 using utf8mb4)/g" infile.sql > outfile.sql
    • Ray 评论中的正则表达式对我不起作用,所以我不得不使用以下正则表达式:sed -E "s/(0x'[^,\)]*')/CONVERT(\1 using utf8mb4)/g" infile.sql > outfile.sql
    • 这可行
    • @Eliseo 使用 Ray 评论中的 sed 版本一次处理整个转储文件。
    【解决方案2】:

    我在处理 Sequel Pro 的导出时遇到了这个问题。我取消选中Output BLOB fields as hex 选项,问题就消失了。目视检查导出显示清晰的 JSON 而不是二进制。

    【讨论】:

    • 试过了,但有些字段有引号。 Sequel Pro 导出将其转义为 \",但这应该是 \\"。所以基本上:如果你的 JSON 数据中有引号,那么你对 Sequel Pro 不走运。
    • 这就是我所需要的。谢谢!
    • 谢谢。我只是希望 Sequel Pro 能得到更新。
    【解决方案3】:

    我今天遇到了同样的问题。以下是我的案例的调查结果,

    我让我的一位朋友生成一个 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

    您需要取消选中Output BLOB fields as hex 选项。

    【讨论】:

      【解决方案4】:

      vim 版本对于 Lorcan O'Neill 的回答

      vi xxxx.sql
      :%s/\(X'[^,\)]*'\)/CONVERT(\1 using utf8mb4)/g
      

      【讨论】:

      • 干杯!!节省了我的时间,与 vi 完美配合。
      【解决方案5】:

      这对我有用,(我也可以控制导出到 sql 文件)。有很多警告;例如我知道这些字段永远不会大于 1000,并且不会包含任何非 ascii 字符。 请发表评论并告诉我这一切如此糟糕的所有原因:)

      导出前

      alter table <table> modify <json_column> varchar(1000);
      

      然后导入后

      alter table <table> modify <json_column> json;
      

      【讨论】:

      • 我会推荐使用 LONGTEXT 作为临时类型。如果大小小于 JSON 数据将被截断,并且在转换回 JSON 列时,受影响的记录将抛出错误,并且您的数据仅被部分保存。
      • 是的 :) 因此需要注意
      【解决方案6】:

      对于 2019 年 6 月左右使用 Sequel Pro 的用户,除了取消选中“将 BLOB 字段输出为十六进制选项”(如上所述)之外,您还需要使用每晚构建,它在 2 年前增加了对 JSON 类型的支持。此支持尚未正式发布。

      【讨论】:

      • 您能否提供特定夜间构建的链接,因为尽管取消选中“输出 BLOB 字段作为十六进制选项”,我也面临同样的问题
      • Sequel Pro 已被弃用,现在作为 Sequel Ace 在 App Store 上继续使用。
      【解决方案7】:

      我在转储时遇到了这个问题。我可以通过更改转储文件中的行来修复它:

      /*!40101 SET NAMES binary*/;
      

      /*!40101 SET NAMES utf8mb4*/;
      

      【讨论】:

      • 我的转储中有/*!40101 SET NAMES utf8 */;。将 utf8 替换为 utf8mb4 并没有解决或改变问题。
      【解决方案8】:

      Lorcan's 的回答确实对我很有帮助,但是转换 all 二进制值会产生一堆其他错误消息,例如 Duplicate entry [...] for key 'PRIMARY'。最后我发现JSON条目都以5B或7B开头,以5D或7D结尾,这当然意味着它们以[{开头并以]}结尾。所以对我有用的是只用正则表达式替换那些条目:

      Find:    (X'5B[^,\)]*5D')
      Replace: CONVERT($1 using utf8mb4)
      

      然后

      Find:    (X'7B[^,\)]*7D')
      Replace: CONVERT($1 using utf8mb4)
      

      等等,所有导入错误都消失了! (至少对我而言)

      【讨论】:

        【解决方案9】:

        将排序规则更改为 utf8_general_ci。为我工作。

        【讨论】:

        • 在你的答案中添加一些相关的解释,而不是单行。
        【解决方案10】:

        对于像我这样使用 Symfony 4 / Doctrine 的人:由于某些原因,可以在存储 JSON 的长文本 MySQL 类型中解析相同的实体;或存储 json 的 json MySQL 类型。在我的特殊情况下,手动设置 longtext MySQL 类型解决了这个问题。

        【讨论】:

          【解决方案11】:

          在运行简单的 UPDATE 查询时出现了这个奇怪的问题:

          update some_table set json_attr = '{"test":168}' where id = 123456;
          

          重启 MySQL 修复了它。无法查明原因。

          编辑:我们正在使用 Aurora。看起来这与我们有一个奇怪的配置有关,其中同一个实例同时处理主从/读取器连接。

          【讨论】:

            【解决方案12】:

            所有 MySQL JSON 数据类型信息必须是 UTF8MB4 字符集而不是 BINARY。

            【讨论】:

            • 有没有办法通过当前的 SQL 转储来强制解决这个问题?
            • 如何将其转换为 UTF8MB4?使用 ALTER TABLE table_name CHANGE col_name col_name JSON CHARACTER SET utf8mb4; 时出现错误
            • 不确定他是一个答案,更像是一个陈述。如何解决这个问题?
            • 答案在哪里?
            • 这不是答案。
            猜你喜欢
            • 2018-07-09
            • 1970-01-01
            • 1970-01-01
            • 2020-03-31
            • 2013-05-17
            • 2023-01-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多