web-dev-qa-db-fra.com

Le moyen le plus efficace de stocker l'adresse IP dans MySQL

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?

68
ensnare

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)
106
Daniel Vassallo

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

54
Dean Harding

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.

4
Mark Byers

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.

2
DGM

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

1
Brian Dilley