Le stockage des Adresses IPv6 dans MySQL
Comme cela a été demandé dans le "ipv6 inet_aton et inet_ntoa fonctions nécessaires", il n'y a actuellement aucune fonction MySQL pour le stockage des adresses IPv6. Quel serait le recommandé type de données/fonction pour le stockage de l'insertion? (Je n'ai pas l'intention de les stocker dans une chaîne de caractères). Aussi, je ne veux pas séparer les adresses IPv6 en 2 INT.
- double possible de Magasin IPv6 dans la base de données
Vous devez vous connecter pour publier un commentaire.
Comment sur:
Qui devrait être assez efficace.
Actuellement, il n'existe pas de fonction pour convertir textuelle des adresses IPv6 à partir de/vers le binaire dans le serveur MySQL, comme il est noté dans ce rapport de bug. Vous avez besoin soit de le faire dans votre application ou peut-être en faire une fonction (Fonction Définie par l'Utilisateur) dans le serveur MySQL de le faire.
Mise à JOUR:
MySQL 5.6.3 a un support pour les adresses IPv6, consultez la rubrique suivante: "INET6_ATON(expr)".
Le type de données est
VARBINARY(16)
au lieu deBINARY(16)
comme je l'ai suggéré plus tôt. La seule raison pour cela est que les fonctions MySQL de travail pour les deux adresses IPv6 et IPv4.BINARY(16)
est très bien pour le stockage uniquement IPv6, les adresses et les enregistre sur un octet.VARBINARY(16)
doit être utilisé lors de la manipulation à la fois des adresses IPv6 et IPv4.Une mise en œuvre pour les anciennes versions de MySQL et MariaDB, voir le texte suivant: "L'EXTENSION MYSQL 5 AVEC IPV6, FONCTIONS DE".
Personne n'a posté un travail plein de réponse (et de nombreux exemples d'utilisation de Windows
::1
qui peut être très trompeuse pour vivre (ou "production") environnements) n'importe où (à moins que je peux trouver) donc, ici, est:INSERT
requête à l'aide d'un nombre assez complexe d'une adresse IP IPv6.SELECT
requête que vous serez en mesure deecho
l'IPv6 adresse IP au client.J'ai changé tous les noms de colonnes à
ipv6
pour refléter le fait qu'ils correctement en charge le protocole IPv6 (et qui permet de garder l'ancienne colonneip
intacte). Il est possible de stocker lesip
colonne dans laipv6
colonne et puis justeDROP
laip
colonne une fois que vous êtes sûr que la conversion a travaillé; quand j'ai le temps je vais ajouter à ce post.IPv6 Type De Données
Comme il a été mentionné
VARBINARY 16
est souhaitable d'aller jusqu'à ce qu'AMD nous bénit avec 128 bits Cpu et les bases de données sont mises à jour à l'appui de 128 bits entiers (j'ai dit ça correctement?). IPv6 est de 128 bits, pas de 64 bits.IPv6 Requête d'INSERTION
Nous avons évidemment besoin de stocker une adresse IP IPv6, avant de nous
SELECT
il; ici est la PHP /SQL code:IPv6 Requête SELECT
La PHP /SQL code:
Ce sera le retour de
fe80::202:b3ff:fe1e:8329
; non, pas le plein IPv6 (qui estFE80:0000:0000:0000:0202:B3FF:FE1E:8329
), c'est un condensé /version courte. Il est le code pour le rendre officiel version intégrale, mais c'est pour me sauver et d'autres fois parce que ce Q/r est celui qui revient sans cesse.Important: juste parce que certains adresses IPv6 look comme s'ils avaient parfaitement
bigint
ne pas implique deux minutes plus tard, quelqu'un avec une grande adresse IPv6 de ne pas s'arrêter et faire des ravages.J'espère que cela va sauver des gens de la folie de l'ouverture de deux douzaine d'onglets. Quand j'ai le temps dans l'avenir, je vais ajouter un petit code PHP qui s'étend le condensé de l'IPv6 à la pleine formelle format.
Dépannage
Si, pour des raisons de stockage et/ou de la récupération des adresses IPv6 ne fonctionne pas pour vous, alors prenez-vous une copie de Rechercher et Remplacer avancé (fonctionne plus rapidement dans le Vin que Linux native de
grep
); ce principalement pour trouver, non de le remplacer. S'assurer que le code est cohérente partout dans votre logiciel.$ip
variables doit être converti à$ipv6
si vous savez que vous avez que peu couverts.)
pour les quatre prochaines étapes:inet_pton(
fonctions et les supprimer.inet_ntop(
fonctions et les supprimer.INET_ATON(
fonctions et les supprimer.INET_NTOA(
fonctions et les supprimer.$ipv6
et s'assurer que toutes les IP-DANS-POUR-les instances SQL utiliserINET6_ATON('$ipv6')
et que toutes les instances où la propriété intellectuelle DE l'utilisation de SQLINET6_NTOA(ipv6) AS ipv6
.$row1['ip']
et de les remplacer par$row1['ipv6']
.$ipv6 =
utiliser le code suivant (avec votre base de données de référence de l'objet modifié):$ipv6 = (isset($_SERVER['REMOTE_ADDR']) && strlen($_SERVER['REMOTE_ADDR']) > 0) ? mysqli_real_escape_string($db,$_SERVER['REMOTE_ADDR']) : mysqli_real_escape_string($db,getenv('REMOTE_ADDR'));
.Excellent exemple cependant, j'ai relevé les suivantes.
Qui ne fonctionne que si la version de
mysql
a comme fonction deINET6_ATON
.Sinon, le message d'erreur peut être quelque chose comme: Que
FUNCTION
DOES
NOT
EXIST
.