2010-08-24 37 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