上周六,由于 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 则不会。 以下是我尝试过的事情:
以上均无效。我发现唯一可行的解决方案是将列替换为文本,然后使用获取和设置器。我们没有使用 JSON 函数。但我担心我们的代码库中可能存在问题,这可能会导致其他地方出现问题(我们在使用 JSON 函数的其他表上有其他 JSON 列)。
请问有人知道这是什么原因吗?
这可能无法回答您的问题,但可能会解决您的问题。
MySQL 版本 8 发生了很大变化,好坏是另一个讨论,但归根结底是兼容性,他们采取的方向不太理想。
MariaDB 来拯救世界!
安装最新的稳定版,将默认字符集设置为 utf8mb4,除非你有理由不这样做,然后就到此为止了。