sql - tener - meta description seo
Longitud máxima para la dirección IP del cliente (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.?
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.
IPv4 utiliza 32 bits, en la forma de:
255.255.255.255
Supongo que depende de su tipo de datos, ya sea que esté almacenando como una cadena con un tipo CHAR o si está utilizando un tipo numérico.
IPv6 utiliza 128 bits. No tendrás IP más tiempo que eso a menos que incluyas otra información con ellos.
IPv6 se agrupa en conjuntos de 4 dígitos hexadecimales separados por dos puntos, como (de wikipedia):
2001:0db8:85a3:0000:0000:8a2e:0370:7334
Si lo desea, puede almacenarlo como una cadena larga de 39 caracteres. Sin embargo, hay otras formas abreviadas de escribir direcciones también. Los conjuntos de ceros se pueden truncar a un solo 0, o los conjuntos de ceros se pueden ocultar completamente con dos puntos dobles.
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.
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 .)
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 .
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
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.
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!)