【问题标题】:Escaping Reserved Characters In A WHERE ... MATCH ... AGAINST... Statement?在 WHERE ... MATCH ... AGAINST ... 语句中转义保留字符?
【发布时间】:2016-06-16 05:25:53
【问题描述】:

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

查询是:

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

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

1064 - 您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在第 1 行靠近 ') +("cpu"*)) ) IN BOOLEAN MODE)'

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

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

所以我查看了mysqlescapestring 的 PHP 文档,我看到它:“将反斜杠添加到以下字符:\x00、\n、\r、\、'、”和 \x1a。”。

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

我确实明白最好使用准备好的语句,这可以解决问题,但我只想了解我在这里做错了什么以及如何在 AGAINST 子句中转义这样的字符串,因为我在这里做了。

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

【问题讨论】:

  • 你到底想成为 AGAINST() 的参数是什么?
  • @e4c5 嘿,感谢您的回复。如果我理解这个问题,任何包含以INTELCPU 开头的单词。如前所述,这确实有效,但前提是我在 PHP 中准备它,这显然是在进行一些转义,但我不确定它到底在转义什么以及它是如何做到的。我将以下参数传递给准备好的语句:+("intel"*) +("cpu"*)

标签: mysql escaping full-text-search prepared-statement


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    相关资源
    最近更新 更多