2010-08-24 15 views
10

binary(16) veya varbinary(16) mu kullanmalıyım?SQL Server'da hem IPv4 hem de IPv6'yı tek bir sütunda nasıl depolanır?

ben IPv4 ve IPv6 ikisinin bir byte[] temsilini elde etmek java.net.InetAddress (Java) veya System.Net.IPAddress (C#) içinde getAddress() kullanabilirsiniz biliyorum ama, SQL Server bir binary(16) alanına IPv4 yani binary(4) yerleştirmeniz gerekiyorsa ihtiyacım var doldurma ya da herhangi bir şey hakkında endişelenmek için?

cevap

15

binary(16) sütununda bir binary(4) depolarsanız, bunu okuduğunuzda, uzunluk 16 olan bir dolgu değerine geri dönersiniz. Dinamik uzunluğa sahip olmak istiyorsanız, bir varbinary(16) kullanmalısınız. Bu tür, diske fazladan 2 bayt (gerçek uzunluk) ekleme pahasına eklenen veri uzunluğunu korur.

+0

IP'nin çoğunun IPv4'te olacağını umduğumdan, varbinary (16) mantıklı olduğunu düşünüyorum. – Henry

+0

Ve değişken uzunluk alanı oluşturma maliyeti – NullUserException

+1

Tam maliyet ayrıntıları için bkz. Http://msdn.microsoft.com/en-us/library/ms178085.aspx ve/veya http://sqlskills.com/blogs/paul /post/Inside-the-Storage-Engine-Anatomy-of-a-record.aspx –

7

ipv4 adreslerinizi ipv6 biçimine dönüştürmek için v4-in-v6 address embedding'u kullanın; sonra hepsini aynı şekilde tedavi edebilirsin.

+0

, öndeki 12x sıfır bayt dolgu ile ikili (4) gibi olmaz mıydı? – Henry

+3

Muhtemelen bu veritabanı sütunundaki bazı girişlerin gerçek ipv6 adresleri olmasını beklersiniz. V4-in-v6 gömülme noktası, uygulama kodunuzun daha fazlasının farkı önemsememesidir (yalnızca v6 adreslerinden başka bir şey olmadığını iddia edebilir). – zwol

İlgili konular