2009-09-06 4 views
4

J'ai besoin de stocker l'adresse IP de la manière la plus compacte possible, la recherche n'est pas un problème. Cela doit également être compatible sur Windows, Linux et Mac en utilisant n'importe quel DB (MySQL, SQLite, Postgres, etc).Comment stockez-vous une adresse IP (v4 ou v6) en tant qu'int dans une base de données en utilisant php?

Grâce aux fonctions ip2long() et long2ip() de PHP, je peux convertir une adresse IP4 en un petit champ int plutôt qu'en un varchar (15) ou autre. Le problème est que nous sommes dans une phase de transition vers IP6, ce qui signifie que la plupart des meilleures pratiques existantes échouent - y compris celles qui ne fonctionnent pas avec IP6. De plus, les fonctions spécifiques à DB comme INET_ATON() et INET_NTOA() ne sont pas des options ici.

Alors, comment pouvez-vous stocker l'adresse IP comme INT (ou tout autre format compact) d'une manière qui fonctionnera sur n'importe quel système? Wrang-wrang point fait référence à l'utilisation de inet_ntop() et de inet_ptop() pour emballer et décompacter IP4 ou IP6. Le problème est qu'ils ne fonctionnent que sur Linux/Mac avec PHP +5.1 (ce qui n'est pas un gros problème) et sur Windows avec +5.3 (qui est).

Si ce n'était pas un problème sont leurs remplacements pour le champ varbinary (16) qui a été recommandé dans chaque base de données?

+0

Vous voudrez peut-être jeter un coup d'œil à [ce thread SO] (http://stackoverflow.com/questions/420680/how-to-store-ipv6-compatible-address-in-a-relational-database). L'affiche s'est contentée d'utiliser deux champs 'BIGINT' pour stocker une adresse IPv6, mais il y a aussi d'autres suggestions que vous pourriez vouloir considérer. – zombat

Répondre

4

Il vous suffit de choisir un moyen de stocker 128 bits:

::/96 - Ceci est un préfixe 96 bits de valeur zéro initialement connu sous le nom adresses IPv4 compatibles. Cette classe d'adresses a été utilisée pour représenter adresses IPv4 dans une technologie de transition IPv6 . Une telle adresse IPv6 a son premier 96 bits mis à zéro, tandis que ses 32 derniers bits sont l'adresse IPv4 qui est représentée. Le Internet Engineering Task Force (IETF) a désapprouvé l'utilisation de adresses compatibles IPv4 avec publication RFC 4291. La seule utilisation restante de ce format d'adresse est de représenter une adresse IPv4 dans une table ou base de données avec fixe taille membres qui doivent également pouvoir stocker une adresse IPv6.

(de http://en.wikipedia.org/wiki/IPv6)

Je pense que deux UNSIGNED BIGINT serait un moyen raisonnable de les stocker, mais je suppose que vous pouvez utiliser un (tableau d'octets) binaire.

Cette question semble avoir été déjà répondu à Working with IPv6 Addresses in PHP et How to store IPv6-compatible address in a relational database

0

Vous pouvez utiliser cette universal php library: ses méthodes ip2long et long2ip fonctionnent à la fois avec IPv4 et IPv6.

+1

Veuillez lire [Comment offrir des bibliothèques Open Source personnelles?] (Https://meta.stackexchange.com/q/229085). –

Questions connexes