2011-01-04 16 views
10

Iba a usar varchar(20), pero me preguntaba qué debería hacer si debería hacer INT y quitarle los períodos. ¿Qué sería mejor y por qué?¿Qué tipo debo almacenar direcciones IP para MySQL?

+0

Depende de qué operaciones va a realizar en los datos. – zerkms

+3

No puedes quitar los períodos o deberías rellenar cada octeto con ceros para que tengan 3 caracteres de largo. De lo contrario, los IP 192.168.45.5 y 192.168.4.55 se verían igual. Cuando la gente sugiere usar un int (32 bits), significa que toma cada octeto (8 bits cada uno) y los empaqueta en un solo int. –

Respuesta

16

Supongo que solo le interesan las direcciones IPv4, no IPv6.

Usaría INT UNSIGNED para la columna, y luego usar INET_ATON y INET_NTOA para convertir de ida y vuelta entre la representación textual y el valor int.

mysql> SELECT INET_ATON('192.168.10.50'); 
+----------------------------+ 
| INET_ATON('192.168.10.50') | 
+----------------------------+ 
|     3232238130 | 
+----------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT INET_NTOA(3232238130); 
+-----------------------+ 
| INET_NTOA(3232238130) | 
+-----------------------+ 
| 192.168.10.50   | 
+-----------------------+ 
1 row in set (0.00 sec) 
0

Si usted está realmente preocupado por el ahorro de espacio, se puede embalar en un int de 4 bytes. Cada bloque de una dirección IP IPv4 puede tener 256 valores posibles, que simplemente es el rango de un solo byte.

- Editar -> Lo que acabo de describir se puede hacer con las funciones de MySQL f00 vinculados en su respuesta

Sin embargo, almacenarla como una cadena ahorrará un poco de tiempo de codificación. Honestamente, a menos que esté haciendo esto a gran escala, la optimización de un formato de almacenamiento más denso no tendrá importancia.

Cuestiones relacionadas