将数据插入 JSON 列时出现 MySQL 错误 ER_INVALID_JSON_CHARSET

问题描述 投票:0回答:1

上周六,由于 AWS 弃用 5.7,我已将数据库升级到 MySQL 8。 一开始似乎一切正常,但现在我们发现系统出现问题。

我正在使用expressJS 和 Node.js 的sequelize。前端以 POST 形式发送数据,然后我们在该表上使用

.create
,该表的列为 JSON。

这是我收到的错误:

  original: Error: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
      at Packet.asError (/Users/test/code/root/node_modules/mysql2/lib/packets/packet.js:728:17)
      at Execute.execute (/Users/test/code/root/node_modules/mysql2/lib/commands/command.js:29:26)
      at Connection.handlePacket (/Users/test/code/root/node_modules/mysql2/lib/connection.js:481:34)
      at PacketParser.onPacket (/Users/test/code/root/node_modules/mysql2/lib/connection.js:97:12)
      at PacketParser.executeStart (/Users/test/code/root/node_modules/mysql2/lib/packet_parser.js:75:16)
      at Socket.<anonymous> (/Users/test/code/root/node_modules/mysql2/lib/connection.js:104:25)
      at Socket.emit (node:events:517:28)
      at Socket.emit (node:domain:489:12)
      at addChunk (node:internal/streams/readable:368:12)
      at readableAddChunk (node:internal/streams/readable:341:9)
      at Readable.push (node:internal/streams/readable:278:10)
      at TCP.onStreamRead (node:internal/stream_base_commons:190:23) {
    code: 'ER_INVALID_JSON_CHARSET',
    errno: 3144,
    sqlState: '22032',
    sqlMessage: "Cannot create a JSON value from a string with CHARACTER SET 'binary'.",
    sql: 'INSERT INTO `guest_item` (`id`,`parentId`,`parentBookItemId`,`order`,`itemType`,`itemId`,`itemData`,`createdBy`,`updatedBy`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?,?,?,?,?,?,?,?,?);',
    parameters: [
      2002,
      null,
      0,
      'contact',
      '5',
      '{"id":1,"name":"JANE DOE","email":"[email protected]","jobTitle":"Director of Sales","primaryPhoneNumber":"1112223333","image":null,"propertyName":""}',
      3,
      3,
      '2024-02-28 10:11:02',
      '2024-02-28 10:11:02'
    ]
  }

表格和代码非常简单:

      itemData: {
        type: DataTypes.JSON,
        allowNull: true
      },
          await GuestItem.create({
            ...
            itemData: chapterItem.itemData, //this is an object
            ...
          });

如果我使用 SQL 查询将此数据保存到数据库中,它会起作用,但通过 Sequelize 则不会。 以下是我尝试过的事情:

  • 设置连接字符集
  • 确保 POST 调用使用内容类型 application/json 和 utf8
  • 使用 JSON.stringify 和 parse 来清理 JSON
  • 使用脚本删除非 utf8 字符。

以上均无效。我发现唯一可行的解决方案是将列替换为文本,然后使用获取和设置器。我们没有使用 JSON 函数。但我担心我们的代码库中可能存在问题,这可能会导致其他地方出现问题(我们在使用 JSON 函数的其他表上有其他 JSON 列)。

请问有人知道这是什么原因吗?

mysql node.js json sequelize.js
1个回答
0
投票

这可能无法回答您的问题,但可能会解决您的问题。

MySQL 版本 8 发生了很大变化,好坏是另一个讨论,但归根结底是兼容性,他们采取的方向不太理想。

MariaDB 来拯救世界!

安装最新的稳定版,将默认字符集设置为 utf8mb4,除非你有理由不这样做,然后就到此为止了。

© www.soinside.com 2019 - 2024. All rights reserved.