2010-08-24 38 views
10

我应该使用binary(16)还是varbinary(16)如何在SQL Server中的单列中存储IPv4或IPv6?

我知道我可以使用getAddress()java.net.InetAddress(JAVA)或System.Net.IPAddress(C#),以同时获得IPv4IPv6byte[]表示,但如果我需要插入IPv4binary(4)binary(16)领域SQL Server,我需要担心填充或任何东西?

回答

15

如果您在binary(16)列中存储了binary(4)列,那么当您读取它时,将返回长度为16的填充值。如果要具有动态长度,则必须使用varbinary(16)。这种类型保留了插入数据的长度,但需要额外增加2个字节(实际长度)。

+0

由于我预计IP的大部分仍然在IPv4中,我猜varbinary(16)是有意义的。 – Henry 2010-08-25 00:03:46

+0

创建可变长度字段的成本 – NullUserException 2010-08-25 00:04:16

+1

有关确切的成本详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms178085.aspx和/或​​http://sqlskills.com/blogs/paul /post/Inside-the-Storage-Engine-Anatomy-of-a-record.aspx – 2010-08-25 00:16:22

7

使用v4-in-v6 address embedding将您的ipv4地址转换为ipv6格式;那么你可以全部对待他们。

+0

不会像二进制(4)前面有12x零字节填充? – Henry 2010-08-25 01:13:01

+3

假设您希望此数据库列中的某些条目是实际的ipv6地址。 v4-in-v6嵌入的意义在于,更多的应用程序代码不必关心它们之间的区别(它可以假装它只有v6地址)。 – zwol 2010-08-25 01:17:20