由于@(at符号),以下查询导致错误。删除后,查询将正常工作。我试图逃避@角色,但没有运气。
SELECT * FROM clients WHERE MATCH (form) AGAINST ('test@test.com' IN BOOLEAN MODE);
产生的错误是:
#1064 - syntax error, unexpected '@', expecting $end
请注意,我正在phpMyAdmin SQL控制台区域中测试这些查询,因此我的其他编程不会出现转义错误。
MySQL服务器是5.6.17版。
有任何想法吗?谢谢。
这与INNODB FULLTEXT索引相关联。
它是作为以下组合引入的:
InnoDB全文搜索不支持在单个搜索词上使用多个运算符
@距离
此运算符仅适用于InnoDB表。它测试两个或多个单词是否都在相互指定的距离内开始,用单词测量。
http://dev.mysql.com/doc/refman/5.6/en/fulltext-boolean.html
# Running a test search for MATCH('+test{$ascii}test' IN BOOLEAN MODE) on all ASCII chars returns errors on:
40 (
41 )
64 @
MYSQL似乎将这些符号视为wordbreaks,我发现无法逃避并将其包含在实际查询中,因此我的解决方案是对符号进行拆分并将它们包含在一个组中,例如“test @ bar”==(+ test + bar)
# As a further test, running a search for MATCH('+{$ascii}' IN BOOLEAN MODE) returns errors for:
40 (
41 )
42 *
43 +
45 -
60 <
62 >
64 @
126 ~
这与MYSQL文档中的预期一样,是特殊的BOOLEAN修饰符
# As a testcase (Requires MYSQL 5.6+):
CREATE TABLE `fulltext_innodb` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`text` text COLLATE utf8_unicode_ci,
PRIMARY KEY (`id`),
FULLTEXT KEY `text` (`text`)
) ENGINE=InnoDB
INSERT INTO `fulltext_innodb` (`id`, `text`) VALUES (1, 'test@bar');
SELECT * FROM `fulltext_innodb` WHERE MATCH (`text`) AGAINST( '+test@bar’ IN BOOLEAN MODE )
#1064 - syntax error, unexpected '@', expecting $end
似乎没有办法用任何其他角色替换“@”术语。删除“@”并将其后的字符串添加到搜索中是我到目前为止找到的最佳解决方法。
这意味着
$mail = 'test@test.com';
$mail = str_replace("@", " +", $mail); //replace the @ that causes the problem
$query = "SELECT * FROM clients WHERE MATCH (form) AGAINST ('$mail' IN BOOLEAN MODE)'; //query with replaced mail address
应该带来所需的结果。
另一种方法是像处理它一样处理它 这个帖子 包含与另一个好的解决方法类似的问题。