我有下表
Table bots{
ip_address varchar(15),
bot_name varchar(32)
}
鉴于一些机器人有静态 ips 而另一些则没有,该表包含诸如 192.168.0 和 192.168.1.15 之类的条目
现在我必须查看给定的 ip 是否属于机器人。我在想一些类似的事情
SELECT bot_name
FROM bots
WHERE __input_ip__ REGEXP '^ip_address'
但这行不通,原因很明显,它正在寻找以 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');
然后您可以查询输入的 IP 地址是否匹配:
SELECT bot_name
FROM bots
WHERE __input_ip__ & netmask = ipaddress & netmask;
对 IP 地址使用整数而不是 CHAR(15) 是一种常见的优化。即使存储 IP 地址和网络掩码的 8 个字节也只是 CHAR(15) 存储空间的一半多一点。而且按位运算可能比正则表达式匹配快很多,并且更容易避免@Gumbo 评论中的极端情况。
关于sql - 正则表达式中的 Mysql 字段名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1460954/