Quel est le type de données le plus approprié pour stocker une adresse IP dans SQL server? [dupliquer]

cette question a déjà une réponse ici:

  • Type de données pour stocker l'adresse ip dans le serveur SQL 10 réponses

quel devrait être le type de données le plus recommandé pour stocker une adresse IPv4 dans SQL server?

Ou peut-être quelqu'un a déjà créé un type de données SQL utilisateur (.net assembly) pour it?

Je n'ai pas besoin de tri.

64
demandé sur Community 2009-06-24 19:05:17

15 réponses

stocker une adresse IPv4 comme une binary (4) est la plus vraie à ce qu'elle représente, et permet une interrogation facile de type masque de sous-réseau. Cependant, il nécessite la conversion in et out 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.

une fonction de serveur SQL peu utilisé qui pourrait aider si vous stockez comme une chaîne de caractères est PARSENAME , au fait. Non conçu pour les adresses IP mais parfaitement adapté pour eux. L'appel ci-dessous retournera '14':

SELECT PARSENAME('123.234.23.14', 1)

(numérotation de droite à gauche).

61
répondu David M 2010-08-15 08:42:41

normalement j'utilise juste varchar (15) pour les adresses IPv4 - mais les Trier est une douleur à moins que vous pad zéros.

je les ai aussi stockés comme INT dans le passé. System.Net.IPAddress a une méthode GetAddressBytes qui retournera l'adresse IP comme un tableau des 4 octets qui représentent l'adresse IP. Vous pouvez utiliser le code C# suivant pour convertir un IPAddress en un int ...

var ipAsInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);

j'avais utilisé cela parce que je devais faire beaucoup de recherche d'adresses dupe, et voulais les index pour être aussi petit et rapide que possible. Alors pour tirer l'adresse de retour de l'int et dans un IPAddress objet .net, utilisez le GetBytes méthode BitConverter pour obtenir l'int comme un tableau d'octets. Passer ce byte array au constructeur pour IPAddress qui prend un tableau d'octets, et on retourne avec les IPAddress que vous avez commencé avec.

var myIp = new IPAddress(BitConverter.GetBytes(ipAsInt));
26
répondu Scott Ivey 2013-07-08 07:10:55

concernant ce commentaire dans la réponse acceptée

les Trier est une douleur sauf si vous pad zéro.

voici un truc 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)

retourne

ip_address
-------------
2.12.4.4
2.12.4.169
131.33.2.201
131.33.2.202
131.107.2.201
17
répondu Martin Smith 2010-08-09 15:42:37

un de mes préférés articles explique pourquoi vous ne devriez pas utiliser d'expressions régulières pour analyser les adresses IP. La plupart de ce qu'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 tout ce que la manipulation de votre application fera (même si l'article est écrit sur Perl, il est utile pour n'importe quelle langue).

je pense qu'à la fin un type de données 32 bits (ou quatre types de données 8 bits) serait le meilleur choix.

4
répondu rmeador 2009-06-24 15:18:41

IPV4? int? ou tinyint x 4?

cela dépend vraiment s'il s'agit de stockage et de récupération ou si cela va être un critère de recherche varié.

3
répondu Cade Roux 2009-06-24 15:07:30

N'oubliez pas IPv6 - vous avez besoin de beaucoup plus de place si vous avez besoin de les stocker - 128bits se compare à IPv4 32.

j'opterais pour bigint, bien que vous ayez besoin d'un code d'aide pour traduire en versions humaines.

3
répondu Lee Atkinson 2009-06-24 15:16:40

je lis beaucoup de questions similaires ici, et aucune des réponses dans celle-ci ne mentionne la réponse numéro un dans d'autres: "pour les adresses IPv4, vous pouvez vouloir les stocker comme un int non signé et utiliser les fonctions INET_ATON() et INET_NTOA() pour retourner l'adresse IP à partir de sa valeur numérique, et vice versa."Je pense que c'est ce que je vais aller dans ma db, sauf si je décide d'utiliser les fonctions php mentionnés ci-dessus.

3
répondu Bobby 2010-08-13 03:01:18

meilleure façon (quand aucun tri et autre contrôle sur L'IPs) est le stocker comme int , le stocker comme varchar etc. coûterait beaucoup plus de performance qu'un simple int innocent.

il y a une propriété IPAddress.Address mais elle est obsolète, Je ne sais pas pourquoi, puisque si vous n'avez pas besoin de tri ou de contrôle sur les classes D'IP, la meilleure façon est de la stocker en entier non signé (qui a une valeur maximale de 0xffffffff qui égale à 255.255.255.255 en représentation décimale.

aussi la classe IPAddress a un constructeur qui accepte un argument long.

et selon VS debugger visualizer, cette classe IPAddress stocke elle-même sa variable interne comme un nombre (pas de tableau octet).

pour en savoir plus sur les solutions de rechange pour stocker une unité dans le serveur MS SQL:

3
répondu Shimmy 2017-05-23 12:17:09

pour un stockage à faible encombrement et lorsque les valeurs doivent être traitées (appariées ou comparées à une plage), j'utilise un int . L'adresse IP n'est qu'une valeur 32 bits.

pour une solution simple où vous voulez simplement stocker la valeur pour la visualiser, j'utilise un varchar(15) pour stocker la représentation string de l'adresse IP.

2
répondu Guffa 2009-06-24 15:18:27

j'ai eu un certain succès avec la réalisation de quatre petites colonnes (ou n'importe quel petit type de données entier que vous préférez) -- une pour chaque octet. Ensuite, vous pouvez faire une vue qui les brise ensemble comme une chaîne de caractères (pour l'affichage) ou alors vous pouvez écrire des opérateurs simples pour déterminer qui tout est dans ce sous-réseau, etc.

il est assez rapide (à condition que vous fassiez l'indexation appropriée) et permet également de poser des questions très facile (pas de manipulation de chaîne de caractères!).

1
répondu Matt Rogish 2009-06-24 15:15:56

étant donné qu'une adresse IP contient 32 bits, pouvez-vous simplement utiliser un LONG pour stocker la valeur numérique?

Il ne serait pas aussi gaspilleur d'espace que L'utilisation de VARCHAR, mais alors vous devez le décoder à nouveau à une IP avant de l'utiliser, à chaque fois, et le retard et les frais généraux que les coûts pourraient ne pas être la peine.

0
répondu SqlRyan 2011-01-02 14:52:38

je dirais probablement varchar ou char .

et régler la taille à 15.

0
répondu Simon P Stevens 2011-01-02 14:53:14

le type de données le plus approprié pour stocker une adresse IPv4 dans une base de données MSSQL est un int . Le seul petit peu est de le convertir de nouveau en notation pointillée pour l'affichage / tri, donc je vous recommande de créer une vue qui automatise ceci pour vous.

0
répondu Ian Kemp 2014-07-04 20:46:05

je suis novice @ php,sql , mais je pense que la façon la plus rapide de stocker quelque chose dans sql db est de le convertir en valeur int et enregistrer en int.

j'ai utilisé la fonction en php -

function ip_convert() {
    $ip = $_SERVER['REMOTE_ADDR'];
    $intip = str_replace(".","0",$ip);
    return $intip;
}

et puis je remplace tous les points par des zéros. Alors si j'ai besoin d'utiliser cette adresse IP de sql.. if ($ip == ip_convert ())

mais seulement si vous utilisez PHP.

-3
répondu Ernests ENkss Zemturis 2015-08-22 21:42:57

citant this :

stocker les adresses IP dans une colonne CHAR(15). Selon la quantité de données que vous stockez, cela peut être assez gaspillage (pourquoi avons-nous besoin pour stocker les points?). I

-4
répondu joe 2011-11-22 08:14:25