Moyen le plus efficace de stocker l’adresse IP dans MySQL

Quel est le moyen le 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 les adresses IPv4 , vous pouvez les stocker sous la forme d’un int unsigned et utiliser les fonctions INET_ATON() et INET_NTOA() pour renvoyer l’adresse IP à partir de sa valeur numérique et inversement.

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 de 32 bits.

Si vous souhaitez également prendre en charge IPv6, une chaîne est probablement la méthode la plus facile à lire / utiliser (bien que vous puissiez les stocker techniquement dans un champ VARBINARY() 16 octets, cela serait ennuyeux d’essayer de générer des instructions SQL). pour sélectionner par adresse IP “à la main”)

L’essentiel est de s’assurer que cette colonne est indexée. Cela pourrait faire une énorme différence pour les requêtes basées sur l’adresse IP.

peut-être stocker la valeur entière directement dans un champ entier? Une adresse IP est essentiellement 4 “shorts”.

Check it out: http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip

Tout ce qui est le plus facile pour vous de travailler. Le problème de taille ou de vitesse ne pose pas de problème tant que vous ne savez pas qu’il s’agit d’un problème lié au profilage. Dans certains cas, une chaîne peut être plus facile à utiliser si vous devez faire une correspondance partielle. Mais en tant que problème d’espace ou de performance, ne vous inquiétez pas à moins d’avoir de réelles raisons de vous en préoccuper.