33 votos

Cómo almacenar compatible con IPv6 direcciones en una base de datos relacional

¿Cómo puedo hacer eso?

Ahora, IPv6 no se utiliza, pero necesito el diseño de la aplicación para hacerla IPv6 listo. Es necesario para almacenar las direcciones IP y los bloques CIDR (también BGP NLRI, pero esto es otra historia) en una base de datos MySQL. Yo siempre he usado un INT para IPv4 + TINYINT para masklen, pero que es IPv6 de 128 bits.

Cuál es la estrategia que va a ser mejor para que? 2xBIGINT? CHAR(16) de almacenamiento binario? CHAR(39) para el almacenamiento de texto? 8xSMALLINT , en una tabla?

¿Qué recomendaría usted?

19voto

Alnitak Puntos 143355

No estoy seguro de que es el derecho de respuesta para MySQL, dado que aún no soporta IPv6 dirección de formatos de forma nativa (aunque si bien "WL#798: MySQL soporte de IPv6" sugiere que iba a ser en MySQL v6.0, documentación actual no que una copia de seguridad).

Sin embargo, de aquellos que he propuesto yo sugeriría va para 2 * BIGINT, pero asegúrese de que están sin firmar. Hay una especie de separación natural en el /64 dirección de límite en IPv6 (desde /64 es el más pequeño de netblock tamaño), que se alinee bien con eso.

6voto

Steve-o Puntos 9043

Tenga en cuenta que la longitud máxima de una dirección IPv6, incluyendo identificador de ámbito, es de 46 bytes, como se define por INET6_ADDRSTRLEN en el estándar de C encabezados. Para el uso de Internet debe ser capaz de ignorar el identificador de zona (%10, #eth0, etc), pero acaba de ser conscientes de cuando getaddrinfo devuelve un resultado más de lo esperado.

6voto

ʞɔıu Puntos 15907

Si usted está inclinado hacia char(16), sin duda utilizar el binario(16) en su lugar. binario(n) no tiene un concepto de intercalación o conjunto de caracteres (o más bien, es un char(n) con un conjunto de caracteres/intercalación de 'binario'). El valor predeterminado de caracteres en mysql es latin1_swedish_ci, lo que significa que se intentará no distingue mayúsculas de minúsculas clasificación y comparación de los valores de bytes que son válidos los puntos de código en latin1, que le causa todo tipo de problemas inesperados.

Otra opción es el uso de decimales (39, 0) unsigned zerofill, no es tan eficiente como dos bigints (decimal se utiliza 4 bytes por nueve dígitos en las actuales versiones de mysql), pero le permitirá mantener todo en una sola columna y de impresión a cabo muy bien.

2voto

James Anderson Puntos 18253

Yo iría a por el pleno de 39 caracteres "estándar" formato impreso:--

"2001:0db8:85a3:0000:0000:8a2e:0370:7334"

40 con un terminador nulo.

Este es el formato utilizado por los *nix herramientas de línea de comandos, y, el formato de una dirección IPV6 es normalmente(?) informó.

1voto

Jonathan Leffler Puntos 299946

Es la dirección IP que va a utilizar un programa para el cual binario tiene sentido? O tendría que ser mejor almacenar una representación de texto? También, con IPv6, que son menos propensos a utilizar la dirección en general y más propensos a utilizar los nombres de host. Si que es relevante depende de la aplicación, en parte. CHAR(16), sería una mala opción; char es para datos de caracteres y no como grandes corrientes de cero bytes, que son prevalentes en las direcciones IPv6. 2 x BIGINT sería incómodo - dos campos que en realidad son uno (plus es el valor almacenado big-endian o little-endian?). Yo había usado un tamaño fijo de tipo BINARIO, o si no está disponible, un tipo blob.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X