2010-08-24 24 views
10

¿Debo usar binary(16) o varbinary(16)?¿Cómo almacenar tanto IPv4 como IPv6 en una sola columna en SQL Server?

Sé que puedo utilizar getAddress() en java.net.InetAddress (Java) o System.Net.IPAddress (C#) para obtener una representación byte[] de ambos IPv4 y IPv6, pero si tengo que insertar IPv4 es decir binary(4) en un campo binary(16) en SQL Server, ¿necesito preocuparse por el relleno o algo?

Respuesta

15

Si almacena una binary(4) en una columna binary(16) que pondremos en contacto, cuando lo lea, un valor acolchada de longitud 16. Si usted quiere tener la longitud dinámica se debe utilizar un varbinary(16). Este tipo conserva la longitud de los datos insertados, a costa de agregar 2 bytes adicionales en el disco (la longitud real).

+0

Dado que espero que la mayoría de los IP seguirán estando en IPv4, supongo que varbinary (16) tiene sentido. – Henry

+0

Y el costo de crear un campo de longitud variable – NullUserException

+1

Para obtener detalles sobre el costo exacto, consulte http://msdn.microsoft.com/en-us/library/ms178085.aspx y/o http://sqlskills.com/blogs/paul /post/Inside-the-Storage-Engine-Anatomy-of-a-record.aspx –

7

Utilice v4-in-v6 address embedding para convertir sus direcciones ipv4 al formato ipv6; entonces puedes tratarlos a todos de manera idéntica.

+0

¿no sería simplemente binario (4) con un relleno de 12 bytes cero en el frente? – Henry

+3

Es de suponer que espera que algunas de las entradas en esta columna de base de datos sean direcciones IPv6 reales. El objetivo de la incrustación de v4-in-v6 es que a una mayor parte del código de la aplicación no le importará la diferencia (solo puede pretender que no tiene más que direcciones v6). – zwol

Cuestiones relacionadas