首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含电子邮件地址的MySQL InnoDB全文搜索

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

Stack Overflow用户
提问于 2014-03-30 04:00:30
回答 4查看 1.6K关注 0票数 8

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

据我所知,mysql的安装是相同的,但相同的全文搜索在每个安装上的行为不同。

我得到的查询是:

代码语言:javascript
复制
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的笔记本电脑上,查询报错:

代码语言:javascript
复制
Error Code: 1064. syntax error, unexpected '@', expecting $end 

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

感谢您所收到的任何指示。

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2016-11-03 19:19:43

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

代码语言:javascript
复制
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>

尝试这样包装您的电子邮件地址:

代码语言:javascript
复制
SELECT username FROM users WHERE MATCH(user_email) AGAINST('"test@user.com"' IN BOOLEAN MODE);

或转义:

代码语言:javascript
复制
SELECT username FROM users WHERE MATCH(user_email) AGAINST('\"test@user.com\"' IN BOOLEAN MODE);
票数 5
EN

Stack Overflow用户

发布于 2018-08-21 23:23:39

@符号是一个运算符,与布尔搜索冲突...不应该..。这是个bug。

这篇文章指出,更有可能是InnoDB和MyISAM的问题……

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

也许,你在一台机器的DB上有MyISAM ...不知道。

票数 1
EN

Stack Overflow用户

发布于 2018-08-22 01:47:57

什么是上下文?mysql命令行工具?shell脚本?Java?PHP?其他的?我怀疑这个问题的答案将导致什么改变。

\之前的@很可能会解决这个问题。而且这个修复可能在这两个操作系统上都有效。

您是否知道投诉是否与AGAINST中的@有关?还是所有的@?尝试将AGAINST中的@替换为空格。

然后,由于“律师”和“域”可能不是相邻的,所以可能有必要说明

代码语言:javascript
复制
MATCH(question) AGAINST('+lawyer +domain +com +au' IN BOOLEAN MODE)
  AND question LIKE     '%lawyer@domain.com.au%'`

FT给出了性能;LIKE仔细检查了这一结果。

注意:除非您将最小令牌大小设置为2,否则+au将导致零命中。一种解决方法是不在任何小于最小标记大小的“单词”上使用+。( LIKE会覆盖您。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22736163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档