Quelle est la façon la plus efficace de stocker et de récupérer des adresses IP dans MySQL? En ce moment je fais:
SELECT * FROM logins WHERE ip = '1.2.3.4'
Où ip est un champ VARCHAR(15)
.
Y a-t-il une meilleure manière de faire cela?
Pour adresses IPv4 , vous souhaiterez peut-être les stocker en tant que int unsigned
Et utiliser les fonctions INET_ATON()
et INET_NTOA()
fonctions pour renvoyer l'adresse IP à partir de sa valeur numérique, et vice versa.
Exemple:
SELECT INET_ATON('127.0.0.1');
+------------------------+
| INET_ATON('127.0.0.1') |
+------------------------+
| 2130706433 |
+------------------------+
1 row in set (0.00 sec)
SELECT INET_NTOA('2130706433');
+-------------------------+
| INET_NTOA('2130706433') |
+-------------------------+
| 127.0.0.1 |
+-------------------------+
1 row in set (0.02 sec)
Si vous souhaitez uniquement stocker des adresses IPv4, vous pouvez les stocker dans un champ entier 32 bits.
Si vous souhaitez également prendre en charge IPv6, une chaîne est probablement le moyen le plus facile à lire/à utiliser (bien que vous puissiez techniquement les stocker dans un champ VARBINARY()
de 16 octets, il serait ennuyeux d'essayer pour générer des instructions SQL à sélectionner par adresse IP "à la main")
Le plus important est de s'assurer que la colonne est indexée. Cela pourrait faire une énorme différence pour les requêtes basées sur l'adresse IP.
Tout ce qui est le plus facile pour vous de travailler. Le problème de taille ou de vitesse n'est pas un problème tant que vous ne savez pas que c'est un problème par profilage. Dans certains cas, une chaîne peut être plus facile à utiliser si vous devez effectuer une correspondance partielle. Mais en tant que problème d'espace ou de performances, ne vous inquiétez pas à moins que vous n'ayez de réelles raisons de vous en préoccuper.
peut-être stocker la valeur entière directement dans un champ entier? Une adresse IP est essentiellement 4 "courts métrages".
Découvrez-le: http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip