66 votes

Quel est le type de données le plus approprié pour stocker une adresse IP sur un serveur SQL?

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.

62voto

David M Points 45808

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).

27voto

Scott Ivey Points 19577

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));

19voto

Martin Smith Points 174101

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
 

3voto

rmeador Points 15107

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.

2voto

Cade Roux Points 53870

IPV4? int? ou tinyint x 4?

Cela dépend vraiment de savoir s'il s'agit simplement de stockage et de récupération ou s'il s'agira d'un critère de recherche à distance.

Prograide.com

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.

Powered by:

X