在 WHERE ... MATCH ... AGAINST ... 声明中转义保留字符?

Escaping Reserved Characters In A WHERE ... MATCH ... AGAINST... Statement?

我有一个查询包含一些导致语法错误的字符,因为包含保留字符,我正在努力了解如何正确转义字符串。

查询是:

SELECT * FROM `products` 
WHERE MATCH (code, description) 
AGAINST (UPPER(+("intel"*) +("cpu"*)) IN BOOLEAN MODE) 

但是当我 运行 这个查询时,我得到以下错误:

1064 - 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 ') +("cpu"*)) ) IN BOOLEAN MODE)' at line 1

好吧,它不喜欢 ),因为它表明 AGAINST 正在关闭,但它还没有关闭。所以我试着用反斜杠转义它,但它仍然抛出同样的错误。

如果我在 PHP 中使用准备好的语句尝试此操作,同时将搜索字符串 +("intel"*) +("cpu"*) 绑定到它起作用的语句中。所以看起来它逃脱它的方式不是用反斜杠或者有别的东西。

所以我正在查看 mysqlescapestring 的 PHP 文档,我看到它:"prepends backslashes to the following characters: \x00, \n, \r, \, ', " 和 \x1a.".

这表明需要转义单引号和双引号,我尝试这样做但它只是抛出相同的语法错误,但在双引号字符上,即 to use near '\"intel\"*\)...

我知道最好使用准备好的语句,这可以解决问题,但我只想了解我在这里做错了什么以及如何在 [=12= 中转义这样的字符串] 子句,就像我在这里所做的那样。

如果有人能指出我哪里出了问题,将不胜感激。谢谢。

好吧,我设法解决了这个问题。

我在 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.