如何在MySQL中使用INET_ATON进行通配符搜索IP地址? [英] How to do wildcard search for IP addresses using INET_ATON in MySQL?

查看:187
本文介绍了如何在MySQL中使用INET_ATON进行通配符搜索IP地址?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发现此方法使用INET_ATON将IP地址存储在MySQL数据库中为整数: https://stackoverflow.com/a/5133610/4491952

I found this method to store IP addresses in MySQL database as integer using INET_ATON: https://stackoverflow.com/a/5133610/4491952

由于IPv4地址的长度为4个字节,因此您可以使用 INT(UNSIGNED)正好有4个字节:

Since IPv4 addresses are 4 byte long, you could use an INT (UNSIGNED) that has exactly 4 bytes:

`ipv4` INT UNSIGNED

INET_ATON INET_NTOA 转换它们:

And INET_ATON and INET_NTOA to convert them:

INSERT INTO `table` (`ipv4`) VALUES (INET_ATON("127.0.0.1"));
SELECT INET_NTOA(`ipv4`) FROM `table`;

对于IPv6地址,您可以使用 BINARY 代替:

For IPv6 addresses you could use a BINARY instead:

`ipv6` BINARY(16)

并使用 PHP的inet_pton

And use PHP’s inet_pton and inet_ntop for conversion:

'INSERT INTO `table` (`ipv6`) VALUES ("'.mysqli_real_escape_string(inet_pton('2001:4860:a005::68')).'")'
'SELECT `ipv6` FROM `table`'
$ipv6 = inet_pton($row['ipv6']);

但是如何使用INET_ATON和PHP的ip2long函数进行通配符搜索,例如192.168.%?

But how can I do a wildcard search, for example 192.168.%, using INET_ATON and PHP's ip2long function?

推荐答案

通配符搜索对字符串进行操作,并且由于通常无法从索引中受益,因此通配符搜索往往非常慢.

Wildcard search operates on strings and, since it can't normally benefit from indexes, it tends to be extremely slow.

如果以针对机器的标准化表示形式存储IP地址(相对于人类可读的点符号),则可以将它们视为数字,使用许多标准运算符并充分利用索引.一个例子:

If you store IP addresses in a normalised representation aimed at machines (vs the human-readable dot-notation) you can treat them as if they were numbers, use many standard operators and make good use of indexes. An example:

SELECT *
FROM foo
WHERE dot_notation LIKE '192.168.%';

...可以重写为:

SELECT *
FROM foo
WHERE as_integer BETWEEN INET_ATON('192.168.0.0') AND INET_ATON('192.168.255.255');

即使这些INET_ATON()实例仅出于可读性考虑,您也可以只输入结果整数.如果您使用PHP,那么这很简单,因为您可以将其外包给PHP:

Even these INET_ATON() instances are for mere readability, you could just enter the resulting integer. If you use PHP it's trivial because you can outsource it to PHP:

$sql = 'SELECT *
    FROM foo
    WHERE as_integer BETWEEN ? AND ?';
$params = [
   // Not sure whether you still need the sprintf('%u') trick in 64-bit PHP
   ip2long('192.168.0.0'), ip2long('192.168.255.255')
];

我目前无法对其进行测试,但我知道这也适用于IPv6.

I cannot test it right now but I understand this should work with IPv6 as well.

这篇关于如何在MySQL中使用INET_ATON进行通配符搜索IP地址?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆