2010-08-24 3 views
10

Sollte ich binary(16) oder varbinary(16) verwenden?Wie speichern Sie IPv4 oder IPv6 in einer einzelnen Spalte in SQL Server?

Ich weiß, ich getAddress() in java.net.InetAddress (Java) oder System.Net.IPAddress (C#) verwenden, um eine byte[] Darstellung sowohl IPv4 und IPv6, zu bekommen, aber wenn ich in SQL ServerIPv4 dh binary(4) in ein binary(16) Feld einfügen muß, muß ich sich um Polsterung oder irgendetwas sorgen?

Antwort

15

Wenn Sie eine binary(4) in einer binary(16) Spalte speichern, erhalten Sie beim Lesen einen gepolsterten Wert der Länge 16. Wenn Sie dynamische Länge haben möchten, müssen Sie eine varbinary(16) verwenden. Dieser Typ behält die Länge der eingefügten Daten bei, indem zusätzliche 2 Byte auf der Festplatte hinzugefügt werden (die tatsächliche Länge).

+0

Da ich erwarte, dass die Mehrheit der IP wird immer noch in IPv4, ich denke, varbinary (16) macht Sinn. – Henry

+0

Und die Kosten für die Erstellung eines Feldes mit variabler Länge – NullUserException

+1

Für die genauen Kosten Details siehe http://msdn.microsoft.com/en-us/library/ms178085.aspx und/oder http://sqlskills.com/blogs/paul /post/Inside-the-Storage-Engine-Anatomy-of-a-record.aspx –

7

Verwenden Sie v4-in-v6 address embedding, um Ihre IPv4-Adressen in IPv6-Format zu konvertieren; dann kannst du sie alle gleich behandeln.

+0

wäre es nicht genau wie binary (4) mit 12x Null-Byte-Padding vorne? – Henry

+3

Vermutlich erwarten Sie, dass einige Einträge in dieser Datenbankspalte tatsächliche IPv6-Adressen sind. Der Punkt der Einbettung von v4-in-v6 ist, dass mehr von Ihrem Anwendungscode nicht um den Unterschied kümmern muss (er kann nur so tun, als hätte er nur v6-Adressen). – zwol

Verwandte Themen