Mysql

儲存 IPv4 和 IPv6 主機和網路

  • March 7, 2017

我必須將 IPv4/v6 地址和網路(CIDR 表示法)儲存在 MySQL 數據庫中。不幸的是,我只能使用 Mysql。

所以,我正在尋找inet與 PostgreSql 類型相當的東西。

inet 類型在一個欄位中包含 IPv4 或 IPv6 主機地址,以及可選的子網。子網由主機地址中存在的網路地址位數(“網路遮罩”)表示。如果網路遮罩為 32 且地址為 IPv4,則該值不表示子網,僅表示單個主機。在 IPv6 中,地址長度為 128 位,因此 128 位指定了唯一的主機地址。

此類型的輸入格式是地址/y,其中地址是 IPv4 或 IPv6 地址,y 是網路遮罩中的位數。如果缺少 /y 部分,則網路遮罩對於 IPv4 為 32,對於 IPv6 為 128,因此該值僅表示單個主機。在顯示中,如果網路遮罩指定單個主機,則 /y 部分將被禁止。

我知道 Mysql 5.6 INET_ATON (), INET_NTOA (), INET6_ATON (), INET6_NTOA ()的以下功能。但是我使用的是 Mysql 5.5 …所以,忘記 INET6_xxxx

我也知道以下問題“儲存 IP 地址”,但它不涉及網路 CIDR 表示法。

inet您將如何在 Mysql 5.5 中實現等效的類型?

  • 3 列:網路(2xBIGINT),CIDR(TINYINT)?
  • 細繩 ?(@菲爾)

第一:inet在 MySQL 中還沒有對應的 PostgreSql 類型。

您應該只使用該string類型來儲存所有類型的 IP 地址。如果您需要它們全部以某種格式,請在將它們插入數據庫之前對其進行轉換。

如果您需要使用它們進行計算,正如您所提到的INET_ATON(),並且INET_NTOA()是需要使用的功能。

基於 rubo77… 如果地址塊以 CIDR 表示法儲存,則可能需要確定該塊的第一個和最後一個 IP 地址。

假設我們的 CIDR 塊是 ‘10.20.30.40/24’

mysql test> set @cidr:='10.20.30.40/24';
Query OK, 0 rows affected (0.00 sec)

mysql test> select @cidr;
+----------------+
| @cidr          |
+----------------+
| 10.20.30.40/24 |
+----------------+
1 row in set (0.00 sec)

99% 的情況下,cidr 表示法中的地址是地址塊的首地址。有時,人們會犯錯誤(就像我在這裡故意做的那樣),所以我們可以找到第一個地址,只是為了安全起見……

select inet_ntoa( (@shifted_network_number :=
                  inet_aton(substring_index(@cidr,'/',1)) >> (@host_bits:=(32-substring_index(@cidr,'/',-1))))
                                                          << @host_bits) as starting_ip;
+-------------+
| starting_ip |
+-------------+
| 10.20.30.0  |
+-------------+
1 row in set (0.00 sec)

結束地址…

select inet_ntoa( ((@shifted_network_number :=
                inet_aton(substring_index(@cidr,'/',1)) >> (@host_bits:=(32-substring_index(@cidr,'/',-1)))) + 1
                                                        << @host_bits) - 1) as starting_ip;
+--------------+
| starting_ip  |
+--------------+
| 10.20.30.255 |
+--------------+
1 row in set (0.00 sec)

地址範圍…

select concat( inet_ntoa( (@shifted_network_number :=
                      inet_aton(substring_index(@cidr,'/',1)) >> (@host_bits:=(32-substring_index(@cidr,'/',-1))))
                                                              << @host_bits)
             , ' - '
             , inet_ntoa( (((@shifted_network_number + 1) << @host_bits) - 1))) as IP_Range;
+---------------------------+
| IP_Range                  |
+---------------------------+
| 10.20.30.0 - 10.20.30.255 |
+---------------------------+
1 row in set (0.01 sec)

引用自:https://dba.stackexchange.com/questions/34912