2014-03-25 56 views
7

我希望能够在我的表中存储IPv4和IPv6地址。无论是IPv4还是IPv6地址,存储用户IP地址的最有效方式是什么?将IPv4和IPv6地址存储在单个列中

这将在生产环境中使用,所以未来经过验证的建议是首选。

+0

IPv4地址长度为32位。 IPv6地址长度为128位。对于存储效率,IPv6地址可以存储在“BINARY(16)”列中,但这对于IPv4地址来说效率较低,在“INT UNSIGNED”列中会更好。 – AeroX

+1

相关:http://stackoverflow.com/questions/4444771/how-to-store-a-128-bit-number-in-a-single-column-in-mysql – AeroX

+0

@AeroX如果我使用'BINARY(16 )',我将能够存储的IP地址是例如192.168.1.2或我需要执行一些转换 – user2650277

回答

1

为什么它必须是单列?一些建议...

有2列,一个用于IPv4,一个用于IPv6。

存储在一个单独列的IP地址,并有另一列,基本上保持一个布尔值该地址是IPv4还是不...

+2

这将是一个浪费资源,因为ipaddress并不那么重要。我的意思是,它将从数据库只在极少数情况下。只有一个版本是需要的 – user2650277

7

我会推荐给存储IPv6格式的每个地址。有一个官方映射:IPv4-mapped IPv6 address。它的工作原理是这样的:

就拿IPv4地址192.0.2.44
IPv4映射的IPv6地址将::ffff:192.0.2.44
这也可以写成::ffff:c000:022c192十进制是c0十六进制等)

你可以使用inet_pton()函数来解析这些地址,并且在我的本地系统上,inet_ntop()函数也会以最易读的格式(::ffff:192.0.2.44)输出它们。这样你的应用程序中只有一种格式可以处理。

另请参阅this related answer

+0

每个ipv4地址都有一个ipv6等价物吗?。我也能够将这些ipv6地址转换回ipv4.Can你建议最好的数据类型和大小需要存储ipv6的MySQL – user2650277

+1

对IPv6地址使用BINARY(16),如果按照“相关答案”链接,您将看到如何转换回来。 –