【问题标题】:How to insert alid JSON that contains single quotes into MySQL如何将包含单引号的有效 JSON 插入 MySQL
【发布时间】:2020-04-22 23:31:51
【问题描述】:

我的目标只是将 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 客户端是什么?您是直接在 MySQL 中运行查询,还是从另一个进程(如 NodeJS、PHP 等)连接?

标签: javascript mysql json


【解决方案1】:

我终于找到了答案: https://stackoverflow.com/a/49525488/1359529

原来 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 2012-05-17
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多