如何在mysql

时间:2015-09-15 02:23:41

标签: mysql sql ip

在我的数据库中,地址范围使用IP / CIDR表示法存储在单个列中。此值包含起始和结束IP地址,但需要将它们提取到广播和网络字段中。起始和结束IP地址存储为一个数字。我提到的其中一个帖子,使用MySQL的本机inet_aton()函数将IP转换为IP号,并使用inet_ntoa()函数将IP转换为虚线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)

1 个答案:

答案 0 :(得分:1)

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

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