← Tutti gli articoli

Titolo principale

05 March 2011  ·  Sql Server 2008 · Article  ·  2 visite
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

Si è verificato un errore imprevisto. Ricarica

Rejoining the server...

Rejoin failed... trying again in seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please retry or reload the page.