在 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.
我有一个查询包含一些导致语法错误的字符,因为包含保留字符,我正在努力了解如何正确转义字符串。
查询是:
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.