MYSQL:无效 JSON 文本:"Invalid escape character in string."

MYSQL: Invalid JSON text: "Invalid escape character in string."

我试图将一个 JSON 对象插入到 MySQL JSON 列中,我得到:Invalid JSON text: "Invalid escape character in string."

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

"summary":"Summary of Qualifications:\nAccomplished and results-driven General Business Director with a consistent track record."

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

summary.replace("\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 注入)并且容易出错(unexpected/incorrect 字符串转义,嵌入引号的问题 '字符串中的标记)练习。

您的查询已重写为使用占位符,应该可以正常工作:

db.query('INSERT INTO mydb ' + fields + ' VALUES (?)', [ JSON.stringify(field.contents || {}) ], err ...

潜在的问题是,在 MySQL 文字字符串表达式中,\n 并不意味着 \ + n,它意味着 ASCII 0x10(换行符)。在 JSON 中,引号字符串中的换行符是无效的——JSON 字符串中的换行符被序列化为两个字符,\ + n——而且事实MySQL 的字符串解析器将此模式识别为与 JSON 中相同的意思,这本质上是巧合,尽管这种约定很常见。在这里,它咬你,因为你打算发送两个字符到 MySQL 但解析器解释它。

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