The*_*ter 58
将ip存储为a INT(11) UNSIGNED,然后使用INET_ATON和INET_NTOA函数来存储/检索ip地址.
示例代码:
INSERT table(ip) VALUES (INET_ATON('192.168.0.1')); /*ip = 3232235521*/
SELECT INET_NTOA(ip) As IPAddress FROM table; /*IPAddress = 192.168.0.1*/
Run Code Online (Sandbox Code Playgroud)
如果您需要支持IPv6和IPv4将其存储为BINARY(16)并在将IP地址插入数据库之前转换IP地址.例如,在PHP(通常与MySQL一起使用的langugage)中,您可以使用inet_pton()函数执行此操作.
IPv6地址是128位(16字节),因此您需要一个足够大的字段来存储它.此外,您可能需要一个字段来指示IP是IPv4还是IPv6(IPv6中的:: 192.168.4.10在数字上与IPv4中的192.168.4.10相同,但根据您的应用,您可能需要区分这两者) .
如果需要存储子网,则可能需要存储子网的第一个地址,CIDR掩码和计算的高位地址(广播地址).这有助于搜索,因此您可以执行此类查询
SELECT * FROM networks WHERE lowerBound<=MYIP AND upperBound>=MYIP
Run Code Online (Sandbox Code Playgroud)
如果您正在使用子网,您还应该自己计算下限,而不仅仅依赖用户正确执行(伪代码):
lowerBound = AND(networkAddress, subnetMask)
upperBound = OR(lowerBound, complement(subnetMask))
Run Code Online (Sandbox Code Playgroud)
这适用于IPv4和IPv6.