如何检查MySQL字符串是否与数据库中的部分匹配?

时间:2018-12-20 12:43:41

标签: php mysql

我想做一种黑名单,以便存储在数据库中

id|value
-----------
1|test.com
2|example@
3|@another.
...

现在,我正在寻找最快的方法来检查给定的字符串(例如,电子邮件地址)是否与数据库中的部分值匹配。

例如 my@mail.com->数据库中没有结果->没有垃圾邮件 example@mail.com->与ID2匹配->垃圾邮件 ...

内部人员,MySQL语句有没有办法做到?

目前,我仅看到一种将所有值加载到数组中的方法,请对此进行检查,但是这种方法需要大量资源,而且速度很慢。

非常感谢。

3 个答案:

答案 0 :(得分:2)

像这样使用查询:

SELECT * FROM `table_name` WHERE `value` LIKE '%emailadress%';

答案 1 :(得分:0)

仅在MySQL中可以进行完整处理。
请注意,这将在较大的表上扩展,因为无法使用索引,因此请记住这一点。

查询

SELECT 
 *
FROM  (
  SELECT 
   'test' COLLATE 'utf8mb4_general_ci' AS word 

  UNION ALL

  SELECT  
  'example' COLLATE 'utf8mb4_general_ci' AS word

  # When you need more words
  # UNION AL   
  # SELECT 'another' COLLATE 'utf8mb4_general_ci' AS word
  #

) AS check_list
INNER JOIN
 blacklist
ON
 blacklist.`value` LIKE CONCAT('%', check_list.word ,'%')


# note COLLATE 'utf8mb4_general_ci' might not even be needed to the used server 
# because it's depending on server config and used table charsets/collates

结果

| word    | id  | value    |
| ------- | --- | -------- |
| test    | 1   | test.com |
| example | 2   | example@ |

live demo

或者对于可以在较大表上扩展的最佳版本,您必须使用FULLTEXT索引和MATCH()

查询

SELECT 
 *
FROM
 blacklist
WHERE
  MATCH (blacklist.`value`)
    AGAINST (
      (
        'test example'
      )
    IN BOOLEAN MODE
  )

请参见demo

答案 2 :(得分:0)

不仅仅是检查LOCATE()来查看字符串是否在以字符串形式提供的给定电子邮件地址内?

SELECT
    COUNT(*)
FROM
    blacklist
WHERE
    LOCATE(value, 'my@mail.com');
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+


SELECT
    COUNT(*)
FROM
    blacklist
WHERE
    LOCATE(value, 'example@mail.com');   
+----------+
| COUNT(*) |
+----------+
|        1 |
+----------+

请参见DB Fiddle demo