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

Mik*_*ike 49 php mysql

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

IPv6怎么样?

The*_*ter 58

将ip存储为a 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*/
Run Code Online (Sandbox Code Playgroud)

  • 我认为这不会支持IPv6. (16认同)
  • 在PHP方面,您可以尝试`ip2long`和`long2ip`函数. (6认同)
  • 是的,OP显然没有考虑IPv6.但他应该是. (4认同)
  • 不需要`(11)`.这只是mysql提示您要显示多少位数的提示.在内部,它总是一个完整的32位整数. (4认同)
  • 你为什么要处理INET函数.基本上,您正在记录从网络堆栈传递给您的IP地址.只需将它存储为给定的(希望作为字符串).这样,您就不必在IPv8到达时更改数据库架构. (3认同)
  • @Schneider,IPv6应该在可预见的未来支持我们(IPv6是128位,而IPv4是32位,因此这是IPv4地址数量的2 ^ 96倍),所以我认为我们不需要IPv8寿命.但IPv6在这里,肯定需要得到支持; 已分配最后一个IPv4地址池. (2认同)
  • 我真的更喜欢一个易于使用的数据库,因此我不必运行不必要的函数来查看连续存储的内容.保持一个字符串,它将使select*可读.如果您需要验证数据,请在插入数据之前对其进行验证.我保证你可以节省空间,如果你不能,你为什么要使用MySQL? (2认同)

Mic*_*yan 18

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


use*_*153 7

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


Jas*_*nCG 5

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.