2015-09-15 69 views
0

在我的數據庫中,地址範圍使用IP/CIDR表示法存儲在單個列中。該值包含開始和結束IP地址,但需要將它們提取到廣播和網絡字段中。起始IP地址和結束IP地址存儲爲一個數字。我提到的一個帖子中,使用MySQL的本地inet_aton()函數將IP轉換爲IP地址,然後使用inet_ntoa()函數返回到虛線的IP地址。將地址存儲爲數字可以更有效地查詢數據庫。如何使用IP上的IP和CIDR來計算網絡和廣播地址

根據我對使用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

我認爲你的問題是,你的CIDR地址是IPv6地址。不幸的是,根據MySQL文檔,INET_ATON僅適用於IPv4地址。改用INET6_ATON。你可能需要檢查你的MySQL版本支持INET6_ATON。

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

+0

謝謝。是的,它假設是IPv4地址,並且它在IPv4地址上工作正常。我會研究INET6_ATON。 – Sthita