2010-08-11 19 views
57

cuál debe ser el tamaño ideal para almacenar direcciones IPv4, IPv6 como una cadena en la base de datos MySQL. ¿debería ser suficiente varchar (32)?Tamaño para almacenar direcciones IPv4, IPv6 como una cadena

+0

@Col: No hay una buena alternativa en cualquier versión estable de MySQL estable. –

+0

al menos 2 bigints es una alternativa para el ipv6. e ir a convertir de la cadena ipv4 a la cadena ipv6 sobre la marcha, como se supone por la pregunta y las respuestas –

+8

@Col: ¿Cómo es eso mejor? Todavía tiene que convertir en el código de su aplicación, y cualquier ser humano que tenga que sumergirse en la base de datos en sí mismo no puede LEER las direcciones friggin 'porque no hay una implementación integrada de INET_NTOA para IPv6. –

Respuesta

69

Suponiendo representación textual en una cadena:

  • 15 caracteres para IPv4 (xxx.xxx.xxx.xxx formato, 12 + 3 separadores)
  • 39 characters (32 + 7 separadores) para IPv6

Es la longitud máxima de la cadena.

Alternativas a almacenar como cadena:

  • IPv4 es de 32 bits, por lo que un tipo de datos MySQL que puede contener de 4 bytes va a hacer, utilizando INT UNSIGNED es común junto con INET_ATON y INET_NTOA para manejar la conversión desde la dirección de número y de número a abordar
SELECT INET_ATON('209.207.224.40'); 
     -> 3520061480 

SELECT INET_NTOA(3520061480); 
     -> '209.207.224.40' 
  • Para IPv6, desafortunadamente MySQL no tiene un tipo de datos de 16 bytes, sin embargo, uno puede poner el IPv6 en forma canónica y luego separarlos en 2 BIGINT (8 bytes); sin embargo, usará dos campos.
+14

Esto es incorrecto. Puede escribir direcciones IPv6 en el formato XXXX: XXXX: XXXX: XXXX: XXXX: XXXX: AAA.BBB.CCC.DDD donde la última parte es una dirección incrustada de estilo ipv4. La longitud es 45, creo? – jcoder

+1

@John: Egh, no, no almacena todos los ceros. Las direcciones asignadas IPV4 se deben normalizar a ':: ffff: aaa.bbb.ccc.ddd'. (Las direcciones asignadas IPv4 son las únicas direcciones que deberían aparecer en esa forma, y ​​las direcciones asignadas IPv4 siempre tienen los primeros 80 bits como ceros). –

+2

@John, podría _escribirlo en binario solamente y tomaría más espacio pero, al igual que su bit IPv4, se puede _computar_ desde la dirección de 128 bits, por lo que no es necesario, especialmente en un DB. – paxdiablo

8

Numéricamente, una dirección IPv4 tiene una longitud de 32 bits y una dirección IPv6 de 128 bits. Por lo tanto, necesita un almacenamiento de al menos bytes.

Si la "cadena" que almacena es una codificación de la dirección en forma de bytes, entonces 16 es suficiente.

5

Si usted les está almacenando en forma de cadenas en lugar de patrones de bits: direcciones

IPv4 constará de cuatro caracteres decimales de 3 dígitos con tres separadores ., por lo que sólo tarda 15 caracteres como 255.255.255.255.

Las direcciones IPv6 constan de ocho caracteres hexadecimales de 4 dígitos con siete separadores :, por lo que se necesitan 39 caracteres, como 0123:4567:89ab:cdef:0123:4567:89ab:cdef.

2

Suponiendo que no tiene ninguna información de red (como identificador LL, clase o máscara CIDR) adjunto, una dirección IPv4 es de hasta quince caracteres (números 4x3 + 3 períodos) y una dirección IPv6 puede ser hasta 39 caracteres.

2

la dirección IPv6 tal vez 46 caracteres.

referencia: asignada de IPv4 direcciones IPv6 de doble pila implementaciones IPv6/IPv4 e Híbridos reconocen una clase especial de direcciones, las direcciones IPv4 a IPv6. En estas direcciones, los primeros 80 bits son cero, los siguientes 16 bits son uno, y los 32 bits restantes son la dirección IPv4. Se pueden ver estas direcciones con los primeros 96 bits escritos en el formato estándar IPv6, y los 32 bits restantes escritos en la notación de puntos y decimales habitual de IPv4. Por ejemplo, :: ffff: 192.0.2.128 representa la dirección IPv4 192.0.2.128. Un formato obsoleto para direcciones IPv6 compatibles con IPv4 era :: 192.0.2.128. [61]

2

Además de lo que ya se ha dicho, existe una dirección IPv6 Link-Local. Si desea conservar la dirección para que pueda usar la cadena para crear conexiones, también necesitará mantener la identificación del alcance. En Windows es un número de 16 bits, en Linux puede ser un nombre de interfaz de cadena, no encontré la longitud máxima de un nombre de interfaz.

+0

Sugeriría http: //meta.stackoverflow.com/para este tipo de preguntas – Muhammed

Cuestiones relacionadas