Javascript MYSQL:无效的JSON文本:";字符串中的转义字符无效。”;

Javascript MYSQL:无效的JSON文本:";字符串中的转义字符无效。”;,javascript,mysql,json,node.js,mysql2,Javascript,Mysql,Json,Node.js,Mysql2,我试图在MySQL JSON列中插入一个JSON对象,结果得到:无效JSON文本:“字符串中的转义字符无效。” 有问题的字符是对象此部分中的\n: “总结”:“资历总结:\n全面且以结果为导向的业务总监,具有一致的业绩记录。” 我尝试了JSON.stringify、JSON_OBJECT、JSON_QUOTE,最近的尝试包括: 摘要。替换(“\n”,“\\n”)以及将现有转义字符替换为正确转义字符的变体?转义字符 我正在使用Node、Express和JawsDB,如果它们可能有任何关系的话 编辑

我试图在MySQL JSON列中插入一个JSON对象,结果得到:
无效JSON文本:“字符串中的转义字符无效。”

有问题的字符是对象此部分中的
\n

“总结”:“资历总结:\n全面且以结果为导向的业务总监,具有一致的业绩记录。”

我尝试了JSON.stringify、JSON_OBJECT、JSON_QUOTE,最近的尝试包括:

摘要。替换(“\n”,“\\n”)
以及将现有转义字符替换为正确转义字符的变体?转义字符

我正在使用Node、Express和JawsDB,如果它们可能有任何关系的话

编辑:以下是实际插入代码:

const fields = '(myField)';
const values = `('${JSON.stringify(field.contents || {})}')`;
db.query('INSERT INTO mydb ' + fields + ' VALUES ' + values,
    err => { 
        if (err) {
            console.log(values);
            throw(err) ;
        }
    }
);

您正在使用字符串连接构建查询,这是一种危险的(SQL注入)和容易出错的(意外/不正确的字符串转义,字符串中嵌入引号的问题)

您的查询(重写为使用占位符)应能正常工作:

db.query('INSERT INTO mydb ' + fields + ' VALUES (?)', [ JSON.stringify(field.contents || {}) ], err ...
潜在的问题是,在MySQL文本字符串表达式中,
\n
并不意味着
\
+
n
,它意味着ASCII 0x10(换行符)。在JSON中,带引号的字符串中的换行符是无效的——JSON字符串中的换行符被序列化为两个字符,
\
+
n
——MySQL的字符串解析器将此模式识别为它在JSON中的含义,这一事实本质上是巧合,尽管这种约定很常见。在这里,它咬你,因为你打算发送两个字符到MySQL,但解析器解释它


您可以通过将字符串中的
\
加倍为
\
来解决此问题,服务器将其解释为文本
\
+
n
,但是,允许数据库驱动程序模块为您处理任何必要的引用和转义是更正确的方法。

相反,我会说stringy json并将其放入mysql的varchar列中,然后在检索时使用json解析字符串。parse什么让您相信
\n
是问题?你实际上是怎么做插入的?占位符?(例如,
值(?)?@Michael sqlbot刚刚添加了我的实际代码。。我在这里使用占位符。它还告诉我对象的冒犯线。我想它可能是\n前面的冒号。谢谢@RahulSingh,如果我不能让它工作,这是一个很好的替代方法,尽管我想利用JSON列在varchar上提供的优化。您没有使用占位符。占位符是
VALUES()
中的文本
。使用以下命令:
db.query('INSERT-INTO-mydb'+fields+'VALUES(?)[JSON.stringify(field.contents | |{})],err…
您永远不应该将字符串文本连接到查询中。这是不安全的,并且(正如您现在看到的)容易出错。默认情况下禁用多语句查询以防止SQLi。