我正在处理一个我认为应该非常直观的查询,但不知何故,我在实现它时遇到了一些问题。我想我想要实现的是匹配存储在MySQL DB中的字符串而没有空格和标点符号(其他创造性方法非常受欢迎)。同时我希望查询以变音符号不敏感的方式处理Unicode字符(因此像REGEXP这样的选项有点不幸)。最后一个条件是我在使用InnoDB引擎的MySQL 5.5上,因此不支持全文索引(但如果它有助于将其排序,我可以升级到5.6 / 5.7)。
考虑字符串来自John Doe的Hello-World 存储在DB中的情况。我想在给出搜索字符串 HelloWorld 或 JohnDoe 时找到它。更一般地说,DB中的字符串可以包含括号,下划线和任何其他标点符号(不限于ASCII,但现在可以妥协),而搜索字符串可以是包含或不包含任何分隔符的单词组合。到目前为止我最接近的是将REPLACE函数以菊花链方式列出已知标点符号列表,如下所示:
SELECT text FROM table WHERE REPLACE(REPLACE(text,' - ',''),'',' ')LIKE'%JohnDoe%'
我的问题是:
提前感谢您的帮助。
答案 0 :(得分:2)
我不知道您的搜索必须有多严格限制,但您可以尝试从中删除所有非字母数字字符,以便最终得到一个字符串,例如" HelloWorldfromJohnDoe"而是与之匹配。
看一下这个答案:How to remove all non-alpha numeric characters from a string?
你可能需要稍微改变它,以使它成为你的目的。我将它从CHAR(32)更改为CHAR(255)以确保我可以获得列,但您可能希望完全更改函数以更精确地拟合数据。
然后你这样的事情:
SELECT *
FROM testing
WHERE alphanum(test) LIKE CONCAT('%', alphanum('John Doe'), '%')
应该会给你一个打击。
答案 1 :(得分:0)
我完全忽略了你的问题。您似乎有字符串:
Hello-World from John Doe
如果您想在搜索字符串为JohnDoe
或John Doe
时找到此内容,则只需替换空格:
where replace(text, ' ') like concat('%', 'JohnDoe', '%')
如果你想要一个包含" John"和" Doe"按此顺序,然后:
where replace(text, ' ') like concat('%', 'John%Doe', '%')
我不明白为什么需要100个嵌套replace()
。
答案 2 :(得分:0)
我会在架构上有另一列包含"散列"例如,该名称的版本,假设您拥有该用户:
John Doe The Great
此名称哈希
johndoethegreat
哈希函数的编码方式是以下所有字符串:
John_Doe_THE_great
John Doe The GREAT
John.Doe.The.Great
johnDOE___theGreat
john Doe the great
___john____DOE____THE____great
哈希到相同的值
johndoethegreat
编写这样一个函数是微不足道的。这样您就可以获取用户输入,对其进行哈希处理,然后将其与数据库中的哈希列进行比较
名称如:
Jon Doe
John Doo
当然不会找到
使用MySQL内置的FULLTEXT
搜索功能,按分数对结果进行排序,并选择第一个非零项
http://blog.oneiroi.co.uk/mysql/php/mysql-full-text-search-with-percentage-scoring/