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.