如何在MySQL字段中存储正则表达式模式并检查输入?

时间:2017-11-29 12:30:35

标签: mysql sql regex mariadb percona

我的应用程序由几个微服务组成,我现在正致力于API网关和授权微服务。根据用户执行此活动的权限,将验证和授权每个传入请求。活动由动词(GET,POST,PUT,DELETE)和ENDPOINT(/ interpretations / q44nAj91aH6nd /)组成

我有一个列出所有活动的MySQL表,并希望将用户的请求端点与表中的匹配活动(行)相匹配。

limit

我的问题是,如何匹配此请求的端点的第2行: CREATE TABLE `activities` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `url` varchar(255) NOT NULL DEFAULT '', `method` varchar(20) NOT NULL DEFAULT 'GET', `url_regex` varchar(255) DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `activities` (`id`, `url`, `method`, `url_regex`) VALUES (1,'/interpretations/','POST',''), (2,'','GET','/interpretations/[a-Z0-9]+/'); (应与正则表达式模式/interpretations/q44nAj91aH6nd/匹配)。

当我尝试以下操作时,它不起作用:

/interpretations/[a-Z0-9]+/

2 个答案:

答案 0 :(得分:1)

在MySQl中,正则表达式模式出现在RLIKE和之前的输入数据之后,因此:

SELECT * FROM `activities` WHERE "/interpretations/q44nAj91aH6nd/" RLIKE `url_regex`;

PS,你的正则表达式在字符范围内有语法错误。试试这个:

/interpretations/[a-zA-Z0-9]+/

首先测试你的正则表达式,将输入和模式作为直字符串传递:

SELECT * FROM `activities` WHERE  '/interpretations/q44nAj91aH6nd/' RLIKE  '/interpretations/[a-Z0-9]+/';

给出“无效字符范围”。您在查询中看不到这一点,因为模式错误不会暂停查询,只会删除行

http://sqlfiddle.com/#!9/82e917/2

上提供了一些测试/演示

答案 1 :(得分:0)

RLIKE关心参数的顺序。尝试:

SELECT *
FROM `activities`
WHERE '/interpretations/q44nAj91aH6nd/' RLIKE url_regex;

将正则表达式更改为:

INSERT INTO `activities` (`id`, `url`, `method`, `url_regex`)
    VALUES (1, '/interpretations/', 'POST', ''),
           (2, '', 'GET', '/interpretations/[a-zA-Z0-9]+/');

Here是一个SQL小提琴。