繁体   English   中英

在数据库中存储IP的最佳方法?

[英]Best way to store IP in database?

在MySQL数据库中存储IP地址的最佳字段类型和长度是多少?

IPv6怎么样?

将ip存储为INT(11) UNSIGNED ,然后使用INET_ATONINET_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*/

这取决于你想用它做什么,但最简单的方法可能是将它表示为一个字符串。 这个问题涵盖了处理它需要多少个字符。 (这是45)。

如果您需要支持IPv6和IPv4将其存储为BINARY(16)并在将IP地址插入数据库之前转换IP地址。 例如,在PHP(通常与MySQL一起使用的inet_pton() )中,您可以使用inet_pton()函数执行此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

如果您正在使用子网,您还应该自己计算下限,而不仅仅依赖用户正确执行(伪代码):

lowerBound = AND(networkAddress, subnetMask)
upperBound = OR(lowerBound, complement(subnetMask))

这适用于IPv4和IPv6。

如果您计划通过IP地址搜索数据库,那么查询的速度会快得多。 如果您只是存储显示(例如在日志输出中),那么字符串会更好,因为您不需要来回转换它。

我完全同意Scrum Meister, 最好的方法是在INET函数中使用INT(11) UNSIGNED和存储/检索,但有时如果你不打算通过子网查询,你可以选择VARCHAR(45)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM