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:
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