2

假设一个标题为“交易”的表格

典型查询:select * from transactions where ip=INET_ATON('127.0.0.1');

我希望能够使用特定的第一个八位字节(即 127)对所有 ip 进行正则表达式搜索,但我不太清楚语法。

谢谢!

4

4 回答 4

1

“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' 上的索引来完成,因此效率会大大提高。

于 2009-03-13T03:24:59.953 回答
1

您将 ip 与 INET_ATON 的结果进行比较,这意味着 ip 是一个 32 位整数。您的操作应该很简单...

SELECT * FROM transactions WHERE (longip & 0xFF000000) = (0x7F000000)

这将比将正则表达式应用于字符串中的点 IP 快得多,并且比 LIKE '127.%' 解决方案更快。

于 2009-03-13T03:10:16.760 回答
0

像这样?

select * from transactions where ip REGEXP "^[1-2][1-9][1-9]"
于 2009-03-13T02:52:23.777 回答
0
SELECT * FROM transactions WHERE ip LIKE '127.%';
于 2009-03-13T03:03:01.957 回答