Vi è mai capitato di dover salvare un
indirizzo IP (
IPv4)?
Come sapete un IP
IPv4 è formato da quattro parti numeriche che vanno da 0 a 255 (1 byte) separate da un punto.
Se
volessimo salvare l'informazione su una base dati SQL Server potremmo
usare più campi (uno per ogni parte dell'IP) oppure una stringa.
Nel primo caso, pensare alle where su 4 campi e ad eventuali criteri di join diventa scomodo.
Nel
secondo caso, il campo potrebbe tenere dai 7 (x.x.x.x) ai 15 caratteri
(xxx.xxx.xxx.xxx), occupando fino ad un massimo di 15byte per IP.
Ma
è possibile anche immagazzinarlo come un intero per far sì che
l'occupazione si riduca a 4byte, semplificando la vita anche wui
criteri di join e sulle where (comprese quelle sul range di IP,
decisamente semplificate).
Come fare ad ottenere l'intero di un
indirizzo IPv4? basta seguire questa semplice formula e, con SQL
Server, utilizzare in aggiunta la
PARSENAME function.
Con
questa funzione infatti è possibile ricavare da un fully qualified name
(formato <Server>.<Database>.<Schema>.<Object>)
l'oggetto corrispondente alla posizione che, rispettivamente è 4.3.2.1.
Osserviamo il seguente esempio:
DECLARE @ipString varchar(15) = '192.168.0.15'
DECLARE @IP1 int
DECLARE @IP2 int
DECLARE @IP3 int
DECLARE @IP4 int
-- distinguo i 4
valori
SELECT
@IP1 = CONVERT(TINYINT, PARSENAME(@ipString, 4))
, @IP2 =
CONVERT(TINYINT, PARSENAME(@ipString, 3))
, @IP3 =
CONVERT(TINYINT, PARSENAME(@ipString, 2))
, @IP4 =
CONVERT(TINYINT, PARSENAME(@ipString, 1))
-- controllo se
si tratta di valori di indirizzamento locale e applica le formule
IF @IP1 < 128
SET @IP1 = @IP1 * 256 * 256 * 256
ELSE
SET @IP1 = -(256 - @IP1) * 256 * 256 * 256
SET @IP2 = @IP2 * 256 * 256
SET @IP3 = @IP3 * 256
-- risultato
SELECT
IPInteger = @IP1 + @IP2 + @IP3 + @IP4
/*
IPInteger
-----------
-1062731761
(1 row(s)
affected)
*/
Spero possa tornarvi utile. Il link da cui ho preso questo procedimento è
questo.
Stay tuned!