我正在使用SQLite3的FTS4模块,并且对matchinfo()辅助函数的示例有疑问。
目前我只是试图从http://www.sqlite.org/fts3.html#matchinfo运行matchinfo()示例,但它不起作用。
我在Windows 7上使用SQLite 3.5.9(预编译版本),在带有SQLite 3.6.22的Ubuntu Linux OS 10.04.4和带有SQLite 3.7.10的Mac OS 10.6.8(均为手动编译版本)上进行了尝试。 在所有情况下,FTS4模块都已启用,文档中的所有内容都可以正常工作(偏移和代码段功能,全文搜索查询等)。 在Ubuntu和Mac OS上,使用matchinfo()示例时,我没有得到任何结果。在Windows上,命令行给了我奇怪的字符。 我通过以下方式尝试了它:使用PHP脚本,使用NaviCat for SQLite3和命令行本身。在每种情况下都是一样的。
这是我用于示例的PHP代码:
<?php
$db = new SQLite3("matchtest.db", SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE);
$db->exec("CREATE VIRTUAL TABLE t1 USING fts4(a, b)");
$db->exec("INSERT INTO t1 VALUES('transaction default models default', 'Non transaction reads')");
$db->exec("INSERT INTO t1 VALUES('the default transaction', 'these semantics present')");
$db->exec("INSERT INTO t1 VALUES('single request', 'default data')");
//$result = $db->escapeString("'default transaction \"these semantics\"'");
$result = $db->query("SELECT matchinfo(t1) FROM t1 WHERE t1 MATCH 'default transaction \"these semantics\"'");
while($row = $result->fetchArray()){
var_dump($row);
}
?>
我在网上找不到有关此问题的任何内容。因此,我没有任何线索如何解决它。 也许是因为PHP在处理BLOB方面存在问题?
我希望你们能帮助我。谢谢!
答案 0 :(得分:1)
要将值视为终端输出,请使用:
select quote(matchinfo(t1)) from t1 where t1 match "default transaction";
这显示了像
这样的值X'0200000002000000020000000300000002000000000000000100000001000000010000000200000002000000010000000100000001000000'
X'0200000002000000010000000300000002000000000000000100000001000000010000000200000002000000000000000100000001000000'
也...
This php function帮助我更好地理解了SQLite3文档中列出的C函数,你可以看到blob如何在这个字符串中转换为字符串,而不是int数组。
答案 1 :(得分:0)
matchinfo()
函数以机器字节顺序返回32位无符号整数的blob。您必须使用unpack()
转换二进制字符串:
$result = $db->query("SELECT MATCHINFO(t1) info1 FROM t1 WHERE t1 MATCH 'default transaction \"these semantics\"'");
while($row = $result->fetchArray(SQLITE3_ASSOC)) {
// matchinfo returns 32-bit unsigned integers in machine byte-order
$arrInt32 = unpack('L*', $row['info1']);
echo implode(' ', $arrInt32)."<br>";
}
输出:3 2 1 3 2 0 1 1 1 2 2 0 1 1 0 0 0 1 1 1