69 votes

Le moyen le plus efficace pour stocker l'Adresse IP dans MySQL

Quel est le moyen le plus efficace pour stocker et récupérer des adresses IP dans MySQL? Maintenant je suis en train de faire:

SELECT * FROM logins WHERE ip = '1.2.3.4'

Où ip est un VARCHAR(15) champ.

Est-il une meilleure façon de le faire?

109voto

Daniel Vassallo Points 142049

Pour les adresses IPv4, vous pouvez les stocker en tant que int unsigned et l'utilisation de l' INET_ATON() et INET_NTOA() des fonctions pour retourner 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)

58voto

Dean Harding Points 40164

Si vous souhaitez stocker les adresses IPv4, puis vous pouvez les stocker dans un entier de 32 bits du champ.

Si vous voulez en charge le protocole IPv6 ainsi, puis une chaîne est probablement le plus facile à lire/utiliser (bien que vous pourriez techniquement de les stocker dans un de 16 octets VARBINARY() domaine, il serait ennuyeux d'essayer de générer des instructions SQL pour sélectionner l'adresse IP "à la main")

4voto

Mark Byers Points 318575

La chose la plus importante est de s'assurer que la colonne est indexée. Cela pourrait faire une énorme différence pour les requêtes sur la base de l'adresse IP.

2voto

DGM Points 14007

Ce qui est le plus facile pour vous de travailler avec. La taille ou de problème de vitesse n'est pas un problème jusqu'à ce que vous savez que c'est un problème de profilage. Dans certains cas, une chaîne de caractères peut être plus facile de travailler avec si vous avez besoin de faire de la reconnaissance partielle. Mais comme un espace ou d'un problème de performances, ne vous inquiétez pas à ce sujet, sauf si vous avez de réelles raisons de s'inquiéter à ce sujet.

1voto

Brian Dilley Points 985

peut-être stocker la valeur de l'entier directement dans un champ de type entier? Une adresse IP est essentiellement 4 "shorts".

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

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