我的目标是简单地将JavaScript对象转换为JSON,并将其插入存储MySQL JSON数据类型的MySQL行中。 这个过程必须作为大批量插入的一部分发生,所以我不能手动编辑数据。当在对象上调用JSON.stringify时,我得到了有效的JSON,但是,由于对象中包含的歌词经常包含单引号,当我尝试运行SQL查询时,MySQL会抛出一个解析错误。
这工作正常
const validJson = '{"foo": "bar", "buzz": 1}';
INSERT INTO table_name ( songid, json )
VALUES ( ${song.songid}, ${validJson} );
但是,这并不
const validJsonWithASingleQuote = {"foo's": "bar", "buzz": 1}';
INSERT INTO table_name ( songid, json )
VALUES ( ${song.songid}, ${validJsonWithASingleQuote} );
我也试过使用准备好的声明,但没有成功。
PREPARE myInsert FROM 'INSERT INTO table_name ( songid, json ) VALUES ( ?, ? )';
SET @a = ${song.songid};
SET @b = ${JSON.stringify(r)};
EXECUTE myInsert USING @a, @b;
我还应该提到的是,原始的JavaScript对象中包含了用”\”转义的单引号的字符串。JSON.stringify方法会对这些反斜杠进行解码。
不幸的是,我找到的所有关于这个主题的SO问题要么建议手动用”//”来转义单引号,要么就是没有解决。有没有一种程序化的方法来完成这个任务?也许一个JavaScript或MySQL方法可以生成有效的JSON,并留下”/\’”序列?
解决方案:
我终于找到了我的方法,原来,mysql的Node.js驱动中包含一个 escape 方法。所以,类似这样的工作。
PREPARE myInsert FROM 'INSERT INTO table_name ( songid, json ) VALUES ( ?, ? )';
SET @a = ${song.songid};
SET @b = ${mysql.escape(JSON.stringify(sr))};
EXECUTE myInsert USING @a, @b;