mysql - 如何在mysql上使用IP和CIDR计算网络和广播地址

标签 mysql sql ip

在我的数据库中,地址范围使用 IP/CIDR 表示法存储在单列中。该值包含起始和结束 IP 地址,但需要将它们提取到广播和网络字段中。起始和结束 IP 地址存储为数字。我读过的一篇文章提到,使用 MySQL 的 native inet_aton() 函数将 IP 转换为 IP 数字,然后使用 inet_ntoa() 函数转换回点分 IP 地址。所以将地址存储为数字可以更有效地查询数据库。

根据我的理解,使用IP和CIDR,可以计算出广播地址。 广播地址是网络IP,加上32减去CIDR,2的次方减1

因此,我运行了以下 SQL 更新来填充两列。

UPDATE blocks SET 
broadcast = (INET_ATON(SUBSTRING_INDEX(network_cidr, '/', 1)) + (POW(2, (32-SUBSTR(network_cidr, INSTR(network_cidr, '/')+1)))-1)), 
network = INET_ATON(SUBSTRING_INDEX(network_cidr, '/', 1));

但这对我不起作用。我做错了什么吗?

这是 mysql 表:

network_cidr    network broadcast
2001:1200::/32  (NULL)  (NULL)
2001:1208::/32  (NULL)  (NULL)
2001:1210:1000::/36 (NULL)  (NULL)
2001:1210:100:8000::/49 (NULL)  (NULL)
2001:1210:100::/49  (NULL)  (NULL)
2001:1210:101::/48  (NULL)  (NULL)
2001:1210:102::/47  (NULL)  (NULL)
2001:1210:104::/46  (NULL)  (NULL)
2001:1210:108::/45  (NULL)  (NULL)
2001:1210:110::/44  (NULL)  (NULL)
2001:1210:120::/43  (NULL)  (NULL)
2001:1210:140::/42  (NULL)  (NULL)

最佳答案

我认为您的问题是您的 cidr 地址是 IPv6 地址。不幸的是,根据 MySQL 文档,INET_ATON 仅适用于 IPv4 地址。请改用 INET6_ATON。您可能需要检查您的 MySQL 版本是否支持 INET6_ATON。

http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html

关于mysql - 如何在mysql上使用IP和CIDR计算网络和广播地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32576733/

相关文章:

java - Android Studio SQLite 错误 : Couldn't read row 0, 来自 CursorWindow 的第 3 列

android - 在 Android 应用程序中设置 URL?

erlang - ejabberd的IP地址

mysql - count(*) 查询问题

mysql - 如何使用存储函数安全地检索 sql 数据

mysql - MYSQL中如何对列进行排序

c# - Microsoft.SqlServer.Management.Smo 获取 SQL Server 的恢复模型

mysql - Oracle/MYSQL : Sort records from a select query on a column that contains alphanumeric values

转储导入后,Mysql 卡住了数百个 sleep 进程

java - 如何用 Java 确定我的路由器/网关的 IP?