正则表达式中的MySQL字段名称

Sco*_*ott 6 regex mysql sql

我有下表

Table bots{
    ip_address varchar(15),
    bot_name varchar(32)
}
Run Code Online (Sandbox Code Playgroud)

鉴于某些漫游器具有静态ip,而其他漫游器则没有,该表具有诸如192.168.0和192.168.1.15之类的条目

现在,我必须查看给定的IP是否属于机器人。我在想些类似的事情

SELECT bot_name
FROM bots
WHERE __input_ip__  REGEXP '^ip_address'
Run Code Online (Sandbox Code Playgroud)

但这显然不起作用,因为它正在寻找以ip_address开头的字符串。

所以我的问题是,如何在sql正则表达式中包含字段名称?

Bil*_*win 5

您可能需要考虑将 IP 地址存储为 INT UNSIGNED。还要存储网络掩码,以便您可以区分静态地址和子网。

INSERT INTO bots (ipaddress, netmask, bot_name) 
VALUES (INET_ATOI('192.168.1.0'), INET_ATOI('255.255.255.0'), 'Wall-E');
Run Code Online (Sandbox Code Playgroud)

然后您可以查询以查看输入的 IP 地址是否匹配:

SELECT bot_name
FROM bots
WHERE __input_ip__ & netmask = ipaddress & netmask;
Run Code Online (Sandbox Code Playgroud)

对 IP 地址使用整数而不是 CHAR(15) 是一种常见的优化。即使存储 8 个字节的 IP 地址和网络掩码,也只是 CHAR(15) 存储量的一半多一点。并且按位运算可能比正则表达式匹配快很多,并且更容易避免@Gumbo 的评论中的极端情况。