在MySQL中匹配没有空格和标点符号的字符串

时间:2017-01-09 00:24:45

标签: mysql sql regex string innodb

我正在处理一个我认为应该非常直观的查询,但不知何故,我在实现它时遇到了一些问题。我想我想要实现的是匹配存储在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%'

我的问题是:

  1. 有没有更好的方法而不是使用上面的菊花链?
  2. 如果这是唯一的解决方案,那么当我将一百个或更多个REPLACE函数链接起来时,性能将如何受到影响?
  3. 提前感谢您的帮助。

3 个答案:

答案 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

如果您想在搜索字符串为JohnDoeJohn Doe时找到此内容,则只需替换空格:

where replace(text, ' ') like concat('%', 'JohnDoe', '%')

如果你想要一个包含" John"和" Doe"按此顺序,然后:

where replace(text, ' ') like concat('%', 'John%Doe', '%')

我不明白为什么需要100个嵌套replace()

答案 2 :(得分:0)

方法1

我会在架构上有另一列包含"散列"例如,该名称的版本,假设您拥有该用户:

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

当然不会找到

方法2

使用MySQL内置的FULLTEXT搜索功能,按分数对结果进行排序,并选择第一个非零项

http://blog.oneiroi.co.uk/mysql/php/mysql-full-text-search-with-percentage-scoring/