Saltar al contenido

¿Cuál es el tipo de datos más apropiado para almacenar una dirección IP en el servidor SQL?

El paso a paso o código que verás en este post es la resolución más rápida y válida que encontramos a tu duda o dilema.

Solución:

Almacenamiento de una dirección IPv4 como binary(4) es más fiel a lo que representa y permite realizar consultas sencillas al estilo de máscara de subred. Sin embargo, requiere conversión de entrada y salida si realmente busca una representación de texto. En ese caso, es posible que prefiera un string formato.

Una función de SQL Server poco utilizada que podría ayudar si está almacenando como un string es PARSENAME, de paso. No está diseñado para direcciones IP, pero se adapta perfectamente a ellas. La siguiente llamada devolverá ’14’:

SELECT PARSENAME('123.234.23.14', 1)

(la numeración es de derecha a izquierda).

Normalmente solo uso varchar (15) para las direcciones IPv4, pero ordenarlas es una molestia a menos que agregue ceros.

También los he almacenado como INT en el pasado. System.Net.IPAddress tiene un GetAddressBytes método que devolverá la dirección IP como un array de los 4 bytes que representan la dirección IP. Puede usar el siguiente código C# para convertir un IPAddress a una int

var ipAsInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);

Lo usé porque tenía que buscar muchas direcciones falsas y quería que los índices fueran lo más pequeños y rápidos posible. Luego, para sacar la dirección del int y colocarla en un IPAddress objeto en .net, use el GetBytes método en BitConverter para obtener el int como un byte array. pasa ese byte array al constructor por IPAddress eso toma un byte arrayy terminas de nuevo con el IPAddress con el que empezaste.

var myIp = new IPAddress(BitConverter.GetBytes(ipAsInt));

Con respecto a este comentario en la respuesta aceptada.

ordenarlos es un dolor a menos que complete ceros.

Aquí hay un truco para SQL Server 2008 (de Itzik Ben-Gan en este libro)

with ip_addresses as
(
SELECT '131.33.2.201' AS ip_address UNION ALL
SELECT '2.12.4.4' AS ip_address UNION ALL
SELECT '131.33.2.202' AS ip_address UNION ALL
SELECT '2.12.4.169' AS ip_address UNION ALL
SELECT '131.107.2.201' AS ip_address 
)
select ip_address
from ip_addresses
ORDER  BY CAST('/' + ip_address + '/' AS hierarchyid)

Devoluciones

ip_address
-------------
2.12.4.4
2.12.4.169
131.33.2.201
131.33.2.202
131.107.2.201

Reseñas y puntuaciones del tutorial

Si posees alguna incertidumbre o forma de modernizar nuestro división te sugerimos dejar una crítica y con deseo lo leeremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *