Quel type de données devrait être le plus recommandé pour le stockage d'une adresse IPv4 sur un serveur SQL?
Ou peut-être que quelqu'un a déjà créé un type de données utilisateur SQL (assemblage .Net) pour cela?
Je n'ai pas besoin de trier.
Quel type de données devrait être le plus recommandé pour le stockage d'une adresse IPv4 sur un serveur SQL?
Ou peut-être que quelqu'un a déjà créé un type de données utilisateur SQL (assemblage .Net) pour cela?
Je n'ai pas besoin de trier.
Le stockage de l'adresse IPv4 que d'un binary
(4) est la plus vraie de ce qu'il représente, et permet de faciliter le masque de sous-réseau-le style de l'interrogation. Cependant, elle nécessite une conversion dans et si vous êtes réellement après une représentation de texte. Dans ce cas, vous pouvez préférer un format de chaîne de caractères.
Un peu utilisé la fonction SQL Server qui pourrait aider si vous êtes le stockage comme une chaîne de caractères est - PARSENAME
, par la manière. Pas conçu pour les adresses IP, mais parfaitement adapté pour eux. L'appel ci-dessous sera de retour '14':
SELECT PARSENAME('123.234.23.14', 1)
(la numérotation est de droite à gauche).
J'ai l'habitude de simplement utiliser varchar(15) pour les adresses IPv4 - mais le tri est une douleur, sauf si vous vous protégez des zéros.
J'ai également stockée comme un INT dans le passé. System.Net.IPAddress
a GetAddressBytes
méthode qui retourne l'adresse IP comme un tableau de 4 octets qui représentent l'adresse IP. Vous pouvez utiliser le code C# suivant pour convertir un IPAddress
d'un int
...
var ipAsInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);
J'avais utilisé parce que j'ai eu à faire beaucoup de recherche pour duper les adresses, et je voulais l'index pour être aussi petit et rapide que possible. Alors pour tirer l'adresse de retour de l'int et en IPAddress
objet .net, utilisez l' GetBytes
méthode BitConverter
pour obtenir l'int comme un tableau d'octets. Passer ce tableau d'octets pour le constructeur pour IPAddress
qui prend un tableau d'octets, et la fin de la sauvegarde avec l' IPAddress
que vous avez commencé avec.
var myIp = new IPAddress(BitConverter.GetBytes(ipAsInt));
Concernant ce commentaire dans la réponse acceptée
les trier est une douleur sauf si vous complétez les zéros.
Voici une astuce pour SQL Server 2008 (de Itzik Ben-Gan dans ce livre )
with ip_addresses as
(
SELECT '131.33.2.201' AS ip_address UNION ALL
SELECT '2.12.4.4' AS ip_address UNION ALL
SELECT '131.33.2.202' AS ip_address UNION ALL
SELECT '2.12.4.169' AS ip_address UNION ALL
SELECT '131.107.2.201' AS ip_address
)
select ip_address
from ip_addresses
ORDER BY CAST('/' + ip_address + '/' AS hierarchyid)
Résultats
ip_address
-------------
2.12.4.4
2.12.4.169
131.33.2.201
131.33.2.202
131.107.2.201
Un de mes préférés des articles parle de pourquoi vous ne devriez pas utiliser des expressions régulières pour analyser les adresses IP. La plupart de ce dont ils parlent est vraiment expliquer pourquoi vous devriez être très prudent avec les représentations textuelles des adresses IP. Je vous suggère de le lire avant de décider quel type de données à utiliser dans votre base de données, et probablement aussi pour quelque soit la manipulation de votre application sera en train de faire (même si l'article est écrit à propos de Perl, il est utile pour n'importe quelle langue).
Je pense qu'au final 32 bits de type de données (ou quatre de 8 bits type de données) serait le meilleur choix.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.