我在 2 台 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 ('[email protected]' IN BOOLEAN MODE)
OR user_account.username like '%[email protected]%'
OR legal_matter.display_name like '%[email protected]%'
OR client_account.company_name like '%[email protected]%'
在 10.8 的笔记本电脑上,查询正常执行,在 10.9 的笔记本电脑上,查询抱怨:
Error Code: 1064. syntax error, unexpected '@', expecting $end
TI 不知道它是否与不同的操作系统版本有关,我怀疑不是,但我不知道问题是什么。
非常感谢您的指点。
谢谢。
我有一些查询使用了针对电子邮件的匹配,当我切换到 innodb 时,这些查询开始失败,因为 @ 用于在 InnoDB 中搜索相隔一定距离的单词:
SELECT username FROM users WHERE MATCH(user_email) AGAINST('[email protected]' IN BOOLEAN MODE);
ERROR 1064 (42000): syntax error, unexpected '@', expecting $end
SELECT username FROM users WHERE MATCH(user_email) AGAINST("[email protected]" IN BOOLEAN MODE);
ERROR 1064 (42000): syntax error, unexpected '@', expecting $end
mysql>
尝试像这样包装您的电子邮件地址:
SELECT username FROM users WHERE MATCH(user_email) AGAINST('"[email protected]"' IN BOOLEAN MODE);
或逃脱:
SELECT username FROM users WHERE MATCH(user_email) AGAINST('\"[email protected]\"' IN BOOLEAN MODE);
@ 符号是一个运算符,与布尔搜索冲突...它不应该...它是一个错误。
这篇文章,指出更有可能是InnoDB和MyISAM的问题...
https://bugs.mysql.com/bug.php?id=74042
也许,您在一台机器的数据库上有 MyISAM...不知道。
背景是什么?
mysql
命令行工具? shell脚本?爪哇? PHP?其他?我怀疑这个问题的答案会导致什么改变。
很可能在
@
之前加 \
可以修复它。该修复可能在两个操作系统中都有效。
你知道投诉是针对
@
中的AGAINST
吗?还是全部@
?尝试将 @
中的 AGAINST
替换为空格。
那么,由于“律师”和“域名”可能并不相邻,所以可能需要说
MATCH(question) AGAINST('+lawyer +domain +com +au' IN BOOLEAN MODE)
AND question LIKE '%[email protected]%'`
FT给你性能;
LIKE
仔细检查结果。
警告:除非您将最小标记大小设置为 2,否则
+au
将导致零命中。一种解决方法是不在任何短于最小标记大小的“单词”上使用 +
。 (LIKE
覆盖了你。)
用于搜索
[email protected]
:
SELECT *,
MATCH(email) AGAINST ('+reymysterio* +619* +gmail* +com*' IN BOOLEAN MODE) AS relevance,
email LIKE '[email protected]%' AS exact_match_relevance
FROM wrestlers
WHERE MATCH(email) AGAINST ('+reymysterio* +619* +gmail* +com*' IN BOOLEAN MODE)
ORDER BY exact_match_relevance DESC, relevance DESC;
尝试使用此语法:
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 ('[email protected]' IN BOOLEAN MODE)
OR user_account.username like '%[email protected]%'
OR legal_matter.display_name like '%[email protected]%'
OR client_account.company_name like '%[email protected]%'