MySQL InnoDB全文搜索包含电子邮件地址

时间:2014-03-29 20:00:30

标签: mysql

我在两台Mac笔记本电脑上安装了mysql社区5.6.13 - 一台使用os x 10.8,另一台使用os x 10.9。

据我所知,mysql的安装是相同的,但相同的全文搜索在每次安装时表现不同。

我的查询是:

SELECT legal_matter.* FROM legal_matter 
left join user_account 
on user_account.id = legal_matter.lawyer_id 
left join client_account 
on client_account.id = legal_matter.client_account_id 
WHERE MATCH (legal_matter.question) AGAINST ('lawyer@domain.com.au' IN BOOLEAN MODE) 
OR user_account.username like '%lawyer@domain.com.au%' 
OR legal_matter.display_name like '%lawyer@domain.com.au%' 
OR client_account.company_name like '%lawyer@domain.com.au%' 

在10.8的笔记本电脑上,查询正常执行,在10.9的笔记本电脑上,查询抱怨:

Error Code: 1064. syntax error, unexpected '@', expecting $end 

TI不知道它是否与不同的操作系统版本有任何关系,我怀疑没有,但我不知道问题是什么。

任何指针都感激不尽。

感谢。

4 个答案:

答案 0 :(得分:4)

我使用了与电子邮件匹配的查询,当我切换到innodb时开始失败,因为@用于在InnoDB中搜索相隔一定距离的单词:

SELECT username FROM users WHERE MATCH(user_email) AGAINST('test@user.com' IN BOOLEAN MODE);
ERROR 1064 (42000): syntax error, unexpected '@', expecting $end

SELECT username FROM users WHERE MATCH(user_email) AGAINST("test@user.com" IN BOOLEAN MODE);
ERROR 1064 (42000): syntax error, unexpected '@', expecting $end
mysql>

尝试打包您的电子邮件地址:

SELECT username FROM users WHERE MATCH(user_email) AGAINST('"test@user.com"' IN BOOLEAN MODE);

或转义:

SELECT username FROM users WHERE MATCH(user_email) AGAINST('\"test@user.com\"' IN BOOLEAN MODE);

答案 1 :(得分:1)

@符号是一个运算符,与BOOLEAN SEARCH冲突...不应该...它是一个错误。

这篇文章指出,这很可能是InnoDB和MyISAM的问题...

https://bugs.mysql.com/bug.php?id=74042

也许,您在一台计算机的数据库上安装了MyISAM ...不知道。

答案 2 :(得分:1)

背景是什么? $divisor命令行工具?外壳脚本? Java的? PHP的?其他?我怀疑,对此的答案将导致改变。

很可能在UPDATE board SET score = score * (1 - ?) WHERE player = ?; 之前加上mysql将对其进行修复。而且该修复程序可能在两种操作系统上均有效。

您知道投诉是否与@中的\有关吗?还是所有@?尝试用空格替换AGAINST中的@

然后,由于“律师”和“域”可能并不相邻,因此可能有必要说

@

FT为您提供表演; AGAINST再次检查结果。

注意:除非您将最小令牌大小设置为2,否则MATCH(question) AGAINST('+lawyer +domain +com +au' IN BOOLEAN MODE) AND question LIKE '%lawyer@domain.com.au%'` 将导致零命中。一种解决方法是不要在短于最小令牌大小的任何“单词”上使用LIKE。 (+au覆盖了您。)

答案 3 :(得分:0)

尝试使用以下语法:

SELECT legal_matter.* FROM legal_matter 
left join user_account 
on user_account.id = legal_matter.lawyer_id 
left join client_account 
on client_account.id = legal_matter.client_account_id 
WHERE MATCH (legal_matter.question) AGAINST ('+lawyer@domain.com.au' IN BOOLEAN MODE) 
OR user_account.username like '%lawyer@domain.com.au%' 
OR legal_matter.display_name like '%lawyer@domain.com.au%' 
OR client_account.company_name like '%lawyer@domain.com.au%'