儲存 IPv4 和 IPv6 主機和網路
我必須將 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)