【问题标题】:MySQL InnoDB Full text search containing email addressMySQL InnoDB 包含电子邮件地址的全文搜索
【发布时间】:2014-03-29 20:00:30
【问题描述】:

我在两台 mac 笔记本电脑上安装了 mysql community 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 不知道它是否与不同的操作系统版本有关,我怀疑不是,但我不知道问题是什么。

感激地收到任何指点。

谢谢。

【问题讨论】:

  • 我最终恢复到 OS X 10.8 (Mountain Lion) 并重新安装了 MySQL,这解决了我的问题。只能归结为操作系统版本不同。
  • 这两种情况下的PHP版本是什么?
  • 您没有告诉我们有关您用于连接 MySQL 的客户端的任何信息。

标签: mysql


【解决方案1】:

当我切换到 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);

【讨论】:

  • 额外的转义 -- \" 中的反斜杠 -- 仅当 SQL 已经用引号括起来时才需要。
【解决方案2】:

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

这个帖子,点那个更有可能是InnoDB和MyISAM的问题...

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

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

【讨论】:

  • 大声笑,没注意到这是几年前的问题
  • 上面的引用有效。我想知道更多,所以现在是否有更好的方法。我不是最初的提问者。我到处都在使用innodb。我正在使用 5.6.18
  • InnoDB 全文搜索不支持在布尔全文搜索中使用 @ 符号。 @ 符号保留供@distance 邻近搜索运算符使用。 dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html
  • 引号有效,我正在使用它们。我不知道 Maria,或者 8.0,甚至 5.7。这是一种稳定的方式吗?文档不会建议,但如果是这种情况,它根本不应该工作..
  • @Erubiel - 尽管错误 74042 可能是对关于 1064 的“真实”问题的“真实”答案,但它并未解决操作系统更改导致该错误浮出水面的原因。
【解决方案3】:

上下文是什么? mysql 命令行工具?外壳脚本?爪哇? php?其他?我怀疑这个问题的答案会导致改变。

很可能在@ 前面加上\ 会修复它。该修复程序可能适用于两种操作系统。

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

那么,既然'lawyer'和'domain'可能不是相邻的,可能有必要说一下

MATCH(question) AGAINST('+lawyer +domain +com +au' IN BOOLEAN MODE)
  AND question LIKE     '%lawyer@domain.com.au%'`

FT 为您提供性能; LIKE 仔细检查结果。

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

【讨论】:

  • @user3783243 - 我已添加到我的答案中。
  • @user3783243 - 我没有所有的答案。建议您尝试各种事情——引用、+、字长、删除@ 等。4 个二进制案例 => 2^4 = 16 个测试案例。
【解决方案4】:

尝试使用以下语法:

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%' 

【讨论】:

  • 前导 + 没有任何区别。我还应该指出,上面的查询在 mysql 5.6.13 的登台和生产环境中都有效。只是无法弄清楚为什么它在我的一个开发环境中不起作用
猜你喜欢
  • 2018-07-07
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2020-12-04
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多