sql caracteres - Longitud máxima para la dirección IP del cliente




meta description (8)

Posible duplicado:
¿Longitud máxima de la representación textual de una dirección IPv6?

¿Qué recomendaría como tamaño máximo para una columna de base de datos que almacena las direcciones IP del cliente? Lo tengo configurado en 16 en este momento, pero ¿podría obtener una dirección IP que sea más larga con IPv6, etc.?


Answers

Hay una advertencia con la estructura general de 39 caracteres IPv6. Para las direcciones IPv6 asignadas de IPv4, la cadena puede ser más larga (de 39 caracteres). Un ejemplo para mostrar esto:

IPv6 (39 caracteres):

ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD

IPv4 mapeado IPv6 (45 caracteres):

ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:192.168.158.190

Nota: los últimos 32 bits (que corresponden a la dirección IPv4) pueden necesitar hasta 15 caracteres (ya que IPv4 utiliza 4 grupos de 1 byte y tiene el formato de 4 números decimales en el rango de 0-255 separados por puntos (el carácter . , por lo que el máximo es DDD.DDD.DDD.DDD ).

La longitud máxima correcta de la cadena IPv6, por lo tanto, es 45.

Esto fue en realidad una pregunta de prueba en un entrenamiento de IPv6 al que asistí. (Todos respondimos 39!)


Si solo lo está almacenando como referencia, puede almacenarlo como una cadena, pero si desea hacer una búsqueda, por ejemplo, para ver si la dirección IP está en alguna tabla, necesita una "representación canónica". Convertir todo en un número (grande) es lo correcto. Las direcciones IPv4 pueden almacenarse como un largo int (32 bits) pero necesita un número de 128 bits para almacenar una dirección IPv6.

Por ejemplo, todas estas cadenas son en realidad la misma dirección IP: 127.0.0.1, 127.000.000.001, :: 1, 0: 0: 0: 0: 0: 0: 0: 1


La gente habla de caracteres cuando se puede comprimir una dirección IP en datos sin procesar.

Entonces, en principio, ya que solo usamos IPv4 (32 bits) o IPv6 (128 bits), eso significa que necesita como máximo 128 bits de espacio, o 128/8 = 16 bytes .

Que es mucho menor que los 39 bytes sugeridos (asumiendo que el conjunto de caracteres es ascii).

Dicho esto, tendrá que decodificar y codificar la dirección IP en / desde los datos en bruto, lo que en sí mismo es algo trivial (lo he hecho antes, consulte ip2long() PHP para ip2long() de 32 bits).

Edit: inet_pton (y su opuesto, inet_ntop() ) hace lo que necesita, y funciona con ambos tipos de direcciones. Pero cuidado, en Windows está disponible desde PHP 5.3.


Si desea manejar IPV6 en notación estándar, hay 8 grupos de 4 dígitos hexadecimales:

2001:0dc5:72a3:0000:0000:802e:3370:73E4

32 dígitos hexadecimales + 7 separadores = 39 caracteres.

PRECAUCIÓN: si también desea mantener las direcciones IPV4 asignadas como direcciones IPV6, use 45 caracteres como sugiere @Deepak .


Tómelo de alguien que lo haya intentado de las tres maneras ... solo use varchar (39)

El almacenamiento un poco menos eficiente supera con creces cualquier beneficio de tener que convertirlo en insertar / actualizar y formatearlo al mostrarlo en cualquier lugar.


Para IPv4, podría salir con el almacenamiento de los 4 bytes en bruto de la dirección IP (cada uno de los números entre los períodos en una dirección IP es 0-255, es decir, un byte). Pero entonces tendrías que traducir entrando y saliendo de la base de datos y eso es complicado.

Las direcciones IPv6 son de 128 bits (a diferencia de los 32 bits de las direcciones IPv4). Por lo general, se escriben como 8 grupos de 4 dígitos hexadecimales separados por dos puntos: 2001:0db8:85a3:0000:0000:8a2e:0370:7334 . 39 caracteres son apropiados para almacenar direcciones IPv6 en este formato.

Edición: Sin embargo, hay una advertencia, consulte la respuesta de @ Deepak para obtener detalles sobre las direcciones IPv6 asignadas por IPv4. (La longitud máxima correcta de la cadena IPv6 es de 45 caracteres .)


Como se describe en el artículo de Wikipedia sobre IPv6 ,

Las direcciones IPv6 normalmente se escriben como ocho grupos de cuatro dígitos hexadecimales, donde cada grupo está separado por dos puntos (:)

Una dirección IPv6 típica:

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

Esto es de 39 caracteres de largo. Las direcciones IPv6 tienen una longitud de 128 bits, por lo que posiblemente podría usar una columna binaria (16), pero creo que me quedaría con una representación alfanumérica.


Esta es una respuesta muy parcial a su pregunta, pero espero que sea útil.

Microsoft SQL Server 2008 implementa dos características que son extremadamente útiles para administrar datos jerárquicos:

  • el tipo de datos HierarchyId .
  • expresiones de tabla comunes, utilizando la palabra clave with .

Eche un vistazo a "Modele sus jerarquías de datos con SQL Server 2008" por Kent Tegels en MSDN para comenzar. Vea también mi propia pregunta: consulta recursiva de la misma tabla en SQL Server 2008





sql database database-design