2010-08-24 27 views
10

Devrais-je utiliser binary(16) ou varbinary(16)?Comment stocker à la fois IPv4 ou IPv6 dans une seule colonne dans SQL Server?

Je sais que je peux utiliser getAddress() dans java.net.InetAddress (Java) ou System.Net.IPAddress (C#) pour obtenir une représentation byte[] des deux IPv4 et IPv6, mais si je dois insérer IPv4-à-dire binary(4) dans un champ binary(16) à SQL Server, ai-je besoin s'inquiéter du rembourrage ou de quoi que ce soit?

Répondre

15

Si vous stockez un binary(4) dans une colonne binary(16), vous obtiendrez, lorsque vous l'aurez lu, une valeur matelassée de longueur 16. Si vous voulez avoir une longueur dynamique, vous devez utiliser un varbinary(16). Ce type conserve la longueur des données insérées, au prix d'ajouter 2 octets supplémentaires sur le disque (la longueur réelle).

+0

Puisque je m'attends à ce que la majorité de l'IP soit toujours en IPv4, je suppose que varbinary (16) a du sens. – Henry

+0

Et le coût de création d'un champ de longueur variable – NullUserException

+1

Pour les détails des coûts exacts, voir http://msdn.microsoft.com/en-us/library/ms178085.aspx et/ou http://sqlskills.com/blogs/paul /post/Inside-the-Storage-Engine-Anatomy-of-a-record.aspx –

7

Utilisez v4-in-v6 address embedding pour convertir vos adresses ipv4 au format ipv6; alors vous pouvez les traiter tous de manière identique.

+0

ne serait-il pas comme binaire (4) avec 12x octet zéro remplissage en face? – Henry

+3

Vous supposez probablement que certaines des entrées de cette colonne de base de données sont des adresses IPv6 réelles. Le point de l'intégration v4-in-v6 est que plus de votre code d'application n'aura pas à se soucier de la différence (il peut juste prétendre qu'il n'a que des adresses v6). – zwol