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?
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?
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*/
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).
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()
.
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.
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.