假设一个标题为“交易”的表格
典型查询:select * from transactions where ip=INET_ATON('127.0.0.1');
我希望能够使用特定的第一个八位字节(即 127)对所有 ip 进行正则表达式搜索,但我不太清楚语法。
谢谢!
“transactions.ip”已经是一个整数,这就是提问者使用 INT_ATON 的原因。尝试直接将其与 /regexp 之类的字符串匹配是没有好处的,您必须首先使用反向函数 INT_NTOA 将其转换回 IPv4 地址:
SELECT * FROM transactions WHERE INT_NTOA(ip) LIKE '127.%';
这需要完整的表扫描(击败索引)来转换和比较。
我希望能够使用特定的第一个八位字节(即 127)对所有 ip 进行正则表达式搜索
但是,如果您想与 IP 地址的前半部分进行比较,您可以利用第一个八位字节存储在数字的最高有效位中这一事实,并说:
SELECT * FROM transactions WHERE ip BETWEEN INT_NTOA('127.0.0.0') AND INT_NTOA('127.255.255.255');
这可以使用 'ip' 上的索引来完成,因此效率会大大提高。
您将 ip 与 INET_ATON 的结果进行比较,这意味着 ip 是一个 32 位整数。您的操作应该很简单...
SELECT * FROM transactions WHERE (longip & 0xFF000000) = (0x7F000000)
这将比将正则表达式应用于字符串中的点 IP 快得多,并且比 LIKE '127.%' 解决方案更快。
像这样?
select * from transactions where ip REGEXP "^[1-2][1-9][1-9]"
SELECT * FROM transactions WHERE ip LIKE '127.%';