11
votes

Quel type dois-je stocker des adresses IP pour MySQL?

J'allais utiliser varchar (20) , mais je me demandais ce que je devrais faire si je devrais faire et dépouiller des périodes. Ce qui serait mieux et pourquoi?


3 commentaires

Cela dépend de quelles opérations effectuerez-vous sur les données.


Vous ne pouvez pas simplement dépasser les périodes ou vous seriez à caresser chaque octet avec des zéros afin qu'ils soient tous 3 caractères. Sinon, les 192.168.45.5 et 192.168.4.55 de la propriété intellectuelle semblent identiques. Lorsque les gens suggèrent d'utiliser un int (32 bits), ils signifient que vous prenez chaque octet (8 bits chacun) et faites-les emballer ensemble dans un seul Int.


Pour IPv4 + IPv6 Hybrid, Varbinary (16)


3 Réponses :


3
votes

9 commentaires

Intéressant, je ne savais pas que ces fonctions existaient.


@ajreal - binaire ou x2 bigint non signé


Je vois toujours beaucoup de conseils de stocker les IP comme des entiers sans explication pourquoi faire ça. Un de plus. Pouvez-vous expliquer pourquoi est meilleur ici que (var) CHAR?


@zerkms - Scénario simple, je veux enregistrer l'activité de l'utilisateur afin de supposer que nous avons une table en rondins de 10 millions de lignes (c'est minuscule je sais). En utilisant un char nous obtenons 10 millions * 15 octets = 143 Mo de données IP seulement. 10 millions de lignes * 4 octets = 38 Mo de données IP (différence de 105 Mo). Donc, vous obtiendriez environ 4 fois plus de valeurs tamponnées en utilisant un int. Pourquoi utiliserait-il un caractère mieux ici à votre avis?


@ F00: Parce que nous n'avons pas besoin de le transformer avec INET_NTOA () pour afficher. Et oui, la taille est un argument. Pas très important mais c'est.


@zerkms - Je ferais de loin que mes performances de requête sur de grands volumes de données soient efficaces et plus rapides que de vous inquiéter d'une simple transformation de données que je ferais de mon niveau de présentation.


@ F00: Presque toutes les recherches par le biais de IPS INT et de PRÉ-CHARD seront les mêmes performants.


@ F00: Donnez un échantillon quand ils seront différents de manière spectaculaire. Comment puis-je vous montrer quelque chose qui n'existe pas? :-))) Donnez un échantillon de Serch via IP INT - Impossible d'exécuter des cordes (je sais qu'elles sont, mais pas sûre de me donner un échantillon d'entre eux).


@zerkms Recherche toutes les adresses dans Subnet 10.0.0.123/26. Facile à faire comme un entier non signé, très coûteux à faire si elle est stockée comme une chaîne.



0
votes

Si vous êtes vraiment préoccupé par l'épargne de l'espace, vous pouvez l'emballer dans un INT de 4 octets. Chaque bloc d'une adresse IP IPv4 peut avoir 256 valeurs possibles, ce qui vient d'être la gamme d'un octet unique.

- Edit -> Ce que je viens de décrire peut être fait avec les fonctions MySQL F00 liées dans sa réponse

Cependant, le stocker comme une chaîne permettra d'économiser un peu de temps de codage. Honnêtement, à moins que vous ne le faisiez à très grande échelle, l'optimisation d'un format de stockage plus dense ne comportera pas.


0 commentaires

19
votes

Je présume que vous êtes uniquement intéressé par des adresses IPv4, pas IPv6.

J'utiliserais un Int non signé pour la colonne, puis utilisez iNet_aton et < Code> inet_ntoa pour convertir entre la représentation textuelle et la valeur int. xxx


0 commentaires