我的查询包含一些导致语法错误的字符,因为包含保留字符,我正在努力了解如何正确地转义字符串。
查询是:
SELECT * FROM `products`
WHERE MATCH (code, description)
AGAINST (UPPER(+("intel"*) +("cpu"*)) IN BOOLEAN MODE)
但是当我运行此查询时,我收到以下错误:
1064 - 您的SQL语法出错;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 靠近')+(“cpu”*)))在BOOLEAN MODE)'第1行
好的,它不喜欢)
,因为它表明AGAINST
正在关闭,但它不是(还)。所以我试图用反斜杠来逃避它,但它仍然会引发同样的错误。
如果我在PHP中使用预准备语句尝试此操作,同时将搜索字符串+("intel"*) +("cpu"*)
绑定到它工作的语句中。因此,似乎它逃脱它的方式不是反斜杠或其他东西。
所以我正在查看mysqlescapestring的PHP文档,我看到它:“将反斜杠添加到以下字符:\ x00,\ n,\ r,\,',”和\ x1a。“
这表明单引号和双引号需要转义,我尝试这样做但它只是抛出相同的语法错误但是在双引号字符上,即to use near '\"intel\"*\)...
我确实理解最好使用预处理语句并且这解决了问题,但我只想了解我在这里做错了什么以及如何在AGAINST
子句中转义这样的字符串正如我在这里所做的那样。
如果有人能说明我的错误,那么我们将不胜感激。谢谢。
答案 0 :(得分:1)
好吧,我设法解决了这个问题。
我在another so question上读到了一个帮助我的答案。我意识到当预准备语句包含相对对象时,它会用引号将其封装起来,所以实际上UPPER(?)
会变成UPPER("prepared string")
,这意味着UPPER(+("intel"*) +("cpu"*))
实际应该是UPPER('+("intel"*) +("cpu"*)')
}。
结果是:
SELECT * FROM `product`
WHERE MATCH (code, description)
AGAINST (UPPER('+("intel"*) +("cpu"*)') IN BOOLEAN MODE)
哪种方法没有语法错误。
作为一个注释,如果你在MySQL中转义字符串,那么值得注意的是MySQL uses C escape syntax in strings。