【发布时间】: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)
【问题讨论】: