我有下表
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正则表达式中包含字段名称?
您可能需要考虑将 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 的评论中的极端情况。
归档时间: |
|
查看次数: |
1803 次 |
最近记录: |