Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为SQLite FTS查询转义字符串_Sqlite_Full Text Search_Fts4 - Fatal编程技术网

如何为SQLite FTS查询转义字符串

如何为SQLite FTS查询转义字符串,sqlite,full-text-search,fts4,Sqlite,Full Text Search,Fts4,我正在尝试使用不可信的用户输入执行SQLite FTS查询。我不想让用户访问查询语法,也就是说,他们将无法执行像foo或bar和cat这样的匹配查询。如果他们试图使用该字符串进行查询,我会将其解释为更像foo\或bar\和cats SQLite中似乎没有为此内置任何东西,因此我可能最终会构建自己的转义函数,但这似乎很危险,而且容易出错。有没有更好的方法可以做到这一点?好的,我已经做了进一步的研究,通过一些强大的魔法,您可以访问SQLite的FTS使用的实际标记器。“simple”标记器接受您的字

我正在尝试使用不可信的用户输入执行SQLite FTS查询。我不想让用户访问查询语法,也就是说,他们将无法执行像
foo或bar和cat这样的匹配查询。如果他们试图使用该字符串进行查询,我会将其解释为更像
foo\或bar\和cats


SQLite中似乎没有为此内置任何东西,因此我可能最终会构建自己的转义函数,但这似乎很危险,而且容易出错。有没有更好的方法可以做到这一点?

好的,我已经做了进一步的研究,通过一些强大的魔法,您可以访问SQLite的FTS使用的实际标记器。“simple”标记器接受您的字符串,在[A-Za-z0-0]中未包含的任何字符上将其分隔,并将其余字符小写。如果您执行相同的操作,您将得到一个适合FTS的很好的“转义”字符串


您可以自己编写,但也可以访问SQLite的内部版本。有关这一点的详细信息,请参见此问题:

FTS匹配语法是它自己的小语言。对于FTS5,逐字字符串文字为:

在FTS表达式中,可通过以下两种方式之一指定字符串:

  • 通过将其括在双引号(“)中。在一个字符串中,任何嵌入的双引号字符都可以通过添加第二个双引号字符来转义SQL样式

  • (特例编辑)

事实证明,为FTS查询正确转义字符串非常简单,可以完全可靠地实现:将
替换为
,并在两端将结果括在


在我的例子中,当我把它放入一个准备好的语句中,比如
SELECT stuf FROM fts\u table WHERE fts\u table MATCH?
,它就完美地工作了。然后我将
.bind(fts\u escape(用户输入))
其中
fts\u escape
是我上面描述的函数。

从FTS4迁移到FTS5时,我注意到一件奇怪的事情,我不得不将
形式的“连字符的工作*”
更改为
连字符的工作*
。但是,做类似于
匹配?| |“*”
的事情会更好吗?