【问题标题】:How to calculate network and broadcast address using IP and CIDR on mysql如何在mysql上使用IP和CIDR计算网络和广播地址
【发布时间】:2015-12-11 03:49:06
【问题描述】:

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

根据我使用 IP 和 CIDR 的理解,可以计算广播地址。 The broadcast address is the network IP, plus,32 minus the CIDR,to the power of 2, minus 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)

【问题讨论】:

    标签: mysql sql ip


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。是的,它应该是 IPv4 地址,并且它与 IPv4 地址一起工作正常。我会调查 INET6_ATON。
    猜你喜欢
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2010-10-21
    • 2012-06-28
    • 2015-05-16
    • 2021-05-22
    • 1970-01-01
    相关资源
    最近更新 更多