Question

Je dois mémoriser l'adresse IP de tous les utilisateurs enregistrés dans la base de données. Je me demande, combien de caractères dois-je déclarer pour la colonne d'un tel?

Prise en charge IPv6 Devrais-je aussi? Si oui, quelle est la longueur maximale d'adresse IP?

Était-ce utile?

La solution

Ne pas stocker sous forme de chaîne. Utilisez une colonne int unsigned et stocker / récupérer avec INET_ATON() et INET_NTOA() respectivement. AFAIK MySQL ne supporte pas INET_ * pour ipv6.

EDIT comme par commentaire

Utilisation construite en fonction d'adresses IP Converto vers / à partir de nombres entiers (et donc à stocker les nombres entiers dans la base de données) a pour effet secondaire de valider automatiquement les adresses IP. Dites que vous enregistrez une adresse IP en tant que VARCHAR (16), vous devez vous assurer de ne pas stocker les adresses IP non valides (comme 999.999.999.999 par exemple) avec une validation personnalisée. INET_ * fonctions prennent soin de cela.

Autres conseils

Il est probablement temps de commencer à envisager IPv6. MySQL ne dispose pas de méthodes pour convertir les adresses IPv6 au format binaire. Une chaîne de caractères de quarante traitera toutes les adresses IPv6 normales. Il y a un format qui pourrait dépasser 40 caractères, je considère que les pratiques improbable.

Vous pouvez calculer la taille à partir de là des informations qu'il y aura au maximum 8 quatre groupes de caractères avec 7 caractères de séparation. Le format anormal remplace les deux derniers groupes avec une adresse format IPv4. Sans compression d'adresse, il remplace les 9 derniers caractères avec jusqu'à 15 caractères.

Si vous stockez des blocs, l'indication de la taille du bloc peut prendre 4 caractères plutôt que les 3 caractères requis pour IPv4.

Vous devez vous assurer que vous obtenez la mise en forme est cohérente, mais tous les logiciels que je l'ai vu donne des formats compatibles pour les adresses.

Je vous suggère la migration vers PostgreSQL et l'utilisation de INET ou CIDR types de données.

CREATE TABLE test ( test_id serial PRIMARY KEY, address inet );
INSERT INTO test ( address ) VALUES ( '1.2.3.4'::inet );
INSERT INTO test ( address ) VALUES ( 'a:b::c:d'::inet );
SELECT * FROM test;
 test_id | address  
---------+----------
       1 | 1.2.3.4
       2 | a:b::c:d

Voici la meilleure réponse faite dans l'une des listes de diffusion de MySQL. Lire Meilleur FieldType pour stocker l'adresse IP ... .

En bref, il indique, que je secondes pour utiliser INT (10) non signé.

  1. Il utilise moins de mémoire (4 octets seulement)
  2. Le meilleur pour le tri et la recherche des plages d'adresses IP, surtout si vous regardez pour le pays d'origine de vos visiteurs.

Ainsi, en utilisant 192.168.10.50:

(192 * 2 ^ 24) + (168 * 2 ^ 16) + (10 * 2 ^ 8) + 50 = 3232238130 (résultats en 192.168.10.50)

  

En MySQL, vous pouvez utiliser directement   SELECT INET_ATON('192.168.10.50');   obtenir   3232238130.

ou

+ 192 (168 * 2 ^ 8) + (10 * 2 ^ 16) + (50 * 2 ^ 24) = 839559360 (vers l'arrière, se traduit par 50.10.168.192)

  

En MySQL, vous pouvez utiliser directement   SELECT INET_NTOA(3232238130);   obtenir   arrière 192.168.10.50.

MySQL ils v5.6.3 ajouté le support pour INET6_ATON et INET6_NOTA qui prendra en charge les adresses IPv4 et IPv6. Mais ils ne stockent plus comme un entier. IPv6 retourne un varbinary(16) et IPv4 et retourne un varbinary(4).

http: //dev.mysql. com / doc / refman / 5.6 / fr / Divers-functions.html # function_inet6-Aton

Vous pouvez stocker jusqu'à 15 characaters. S'il vous plaît ne pas utiliser VARCHAR (15) parce que c'est de 16 octets (premier octet gère longueur de la chaîne et donc la récupération et le stockage plus lent). Utilisez CHAR (15) toujours sur quelque chose comme une adresse IP.

Désolé, ne peut pas commenter les réponses. Il y a une question à ce sujet sur stackoverflow . Et je suis totalement d'accord avec la réponse choisie: en utilisant 2xBIGINT est probablement la meilleure façon pour ipv6 actuellement

.
  

Je vous suggère d'aller pour 2 * BIGINT, mais   assurez-vous qu'ils sont non signés. Il y a un   une sorte de scission naturelle à la / 64   limite d'adresse IPv6 (depuis un / 64   est la plus petite taille de netblock) qui   alignerait bien avec cela.

Il est également possible de stocker sur ce ipv4 bigints - soit en marquant l'un d'entre eux NULL ou en utilisant le format V4COMPAT

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top