我正在尝试创建一个聊天系统,每次有人发送消息时,都会将该消息添加到该特定人的数据库中的JSON数组中,但是我遇到的问题是,当有人尝试使用双引号时" "
或他们的消息中的单引号'
。每当添加带有这些特殊字符的消息时,我都会收到错误消息:ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
。我已经在互联网上寻找了类似的问题,并且所有人都说我需要使用\"
来避免双引号,但是当我使用JSON.stringify
方法时,我已经在这样做了。>
不幸的是,这在JSON数组中不起作用,相反,我不得不用\\"
替换双引号,但是当我使用JSON.parse
方法时,我在输出中看到了反斜杠。而且,如果我只使用一个斜杠,则会出现SQL解析错误。
要发送的消息具有ID,时间戳,消息以及发送者的姓名。
[{"ID": 1, "Timestamp": "10/20/2020 11:00 AM", "Msg": "Hello There", "Name": "John"}]
下面是我要尝试的示例:
let previousMessages = JSON.parse(this.state.Messages);
let newMsg = `testing double "quotes" and single quote's`
previousMessages.push({ID: previousMessages.length+1, Timestamp: new Date(), Msg: newMsg.replace(/"/g,'\\"'), Name: "John"});
对我的数据库的查询如下:
UPDATE table1 SET Messages = "${JSON.stringigy(previousMessages)}" WHERE ID = '1';
// output: UPDATE table1 SET Messages = "[{"ID":1,"Name":"John","Msg":"testing double \\\"quotes\\\" and single quote's","TimeStamp":"10/20/2020 11:00 AM"}]" WHERE ID = '1';
我收到的错误是这样的:
Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ID":1,"Name":"John","Msg":"testing double \\\"quotes\\\" and single quote's","T' at line 2
我尝试过的事情
我曾尝试用其他字符替换引号,例如将'
替换为_
的方法是可行的,但似乎每次创建消息时都不必这样做。
我也尝试在SQL查询中使用单引号而不是双引号,例如:UPDATE table1 SET Messages = '${JSON.stringify(previousMessages)}' WHERE ID = '1';
,但这没什么作用
如果有人知道如何在JSON数组中转义这些字符的好方法,那将非常有帮助。我觉得必须有一种简单的方法来转义这些字符,而不是必须为每个字符使用两种不同的replace
方法。
答案 0 :(得分:3)
如果您是直接编写SQL,则在给出有效JSON文本的情况下,您需要:
您无需对双引号进行任何操作。
因此JSON:[1, "John O'Brian", { "hello": "world" }]
将成为Messages='[1, "John O\'Brian", { "hello": "world" }]'
如果您想使用JS生成该文件,则该文件应类似于:
const array = [1, "John O'Brian", { "hello": "world" }];
const json = JSON.stringify(array);
const sql = `UPDATE table1 SET Messages='${json.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}' ...`
...但是您不应该那样做。
使用一个API,该API允许您使用占位符并将其留给数据库引擎以弄清楚如何使用引号。它更容易,不易出错,并且更安全。
例如使用NPM的mysql
模块:
const array = [1, "John O'Brian", { "hello": "world" }];
const json = JSON.stringify(array);
connection.query(
"UPDATE table1 SET Messages=? ....",
[ json ],
function (error, results, fields) {
});
答案 1 :(得分:1)
自MYSQL 5.7.8起,已经支持JSON
数据类型(由RFC 7159,read more定义)。关于引号字符,您有2个选项;首先是使用JSON_OBJECT
定义,如下所示:
UPDATE table1 SET Messages = JSON_OBJECT("message", "quoted \"Value\".");
或通过JSON对象文字设置它(如您所知,必须从JS /后端确保正确的语法):
UPDATE table1 SET Messages = ('{"message": "quoted \\"Value\\"."}');
如前所述,例如,更好的解决方案是使用后端准备好的语句参数/值绑定。如果您的后端是用PHP实现的,则here you can read about it。
答案 2 :(得分:-2)
下面的代码删除引号
SET @user_name = JSON_UNQUOTE(JSON_EXTRACT(jsonText,'$.name'));