49 votes

Meilleur moyen de stocker l'IP dans la base de données?

Quels sont le type et la longueur de champ les plus appropriés pour stocker les adresses IP dans une base de données MySQL?

Qu'en est-il pour IPv6?

58voto

The Scrum Meister Points 17215

Enregistrez l'adresse IP en tant que INT(11) UNSIGNED , puis utilisez les fonctions INET_ATON et INET_NTOA pour stocker / récupérer l'adresse IP.

Exemple de code:

 INSERT table(ip) VALUES (INET_ATON('192.168.0.1')); /*ip = 3232235521*/
SELECT INET_NTOA(ip) As IPAddress FROM table; /*IPAddress = 192.168.0.1*/
 

18voto

Michael Aaron Safyan Points 45071

Cela dépend de ce que vous voulez en faire, mais le moyen le plus simple serait probablement de le représenter sous forme de chaîne. Et cette question concerne le nombre de caractères nécessaires pour le gérer. (Il est 45).

7voto

user11153 Points 375

Si vous souhaitez prendre en charge IPv6 et IPv4, stockez-le en tant que BINARY(16) et convertissez l'adresse IP avant de l'insérer dans la base de données. Par exemple, en PHP (langue couramment utilisée avec MySQL), vous pouvez le faire avec la fonction inet_pton() .

5voto

JasonCG Points 123

Les adresses IPv6 sont de 128 bits (16 octets) si vous avez besoin d'un terrain suffisamment grand pour stocker. Aussi, vous pouvez avoir besoin d'un champ pour indiquer si oui ou non l'IP IPv4 ou IPv6 (::192.168.4.10 en IPv6 est numériquement le même que 192.168.4.10 en IPv4, mais en fonction de votre demande, vous mai nécessité de faire la distinction entre les deux).

Si vous avez besoin de stocker des sous-réseaux que vous souhaitez stocker la première adresse, le masque CIDR, et la valeur calculée supérieure de l'adresse (adresse de broadcast) du sous-réseau. Ce serait aider dans vos recherches afin que vous pourrait faire des requêtes comme ceci

SELECT * FROM networks WHERE lowerBound<=MYIP AND upperBound>=MYIP

Si vous utilisez des sous-réseaux, vous devez aussi calculer que la limite inférieure de vous-même et pas seulement de compter sur l'utilisateur de le faire correctement (pseudo-code):

lowerBound = AND(networkAddress, subnetMask)
upperBound = OR(lowerBound, complement(subnetMask))

Ceci s'applique à la fois IPv4 et IPv6.

4voto

Chris M Points 21

Si vous envisagez de rechercher la base de données par adresse IP, une requête INT sera beaucoup plus rapide. Si vous ne faites que stocker pour l'affichage (par exemple dans une sortie de journal), une chaîne serait préférable, car vous n'avez pas besoin de la convertir d'avant en arrière.

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