Alessio Luffarelli - Sito Web
Sei qui: Guide e Tutorial / Database / Come memorizzare indirizzi IP in SQL Server
Memorizzare Indirizzi IP in SQL Server

In questo articolo vedremo come è possibile memorizzare indirizzi IP nel database Microsoft SQL Server. In particolare questo articolo fa riferimento a MS SQL Server 2005 ma è comunque valido per versioni sia precedenti che successive.

La memorizzazione di indirizzi IP all'interno di un database SQL Server può sembrare una cosa banale ma vediamo subito il motivo per il quale non lo è.

Un indirizzo IP è un numero a 32 bit che per semplicità di utilizzo viene spesso rappresentato nella forma di quattro numeri a tre cifre separati da un punto (es: 62.149.203.226).

In quanto numero a 32 bit, in linea teorica sarebbe possibile memorizzarlo in qualunque campo numerico a 32 bit. In SQL Server purtroppo questo non è applicabile in quanto l’unico tipo di dato a 32 bit è il tipo int, che però è definito come un numero intero con segno, il cui range va da -231 a 231-1.

Questo lo rende inapplicabile per memorizzare indirizzi IP che sono definiti come numeri interi positivi il cui range va da 0 (0.0.0.0) a 232-1 (255.255.255.255).

Una possibile soluzione sarebbe quella di utilizzare il tipo numerico più grande di SQL Server e cioè il tipo bigint. Questo tipo di dati ha un range che va da -263 a 263-1 e quindi è più che sufficiente a memorizzare indirizzi IP.

Il problema in questo caso è che un purista e minimalista della programmazione quale sono io, non può accettare di utilizzare un tipo di dati a 64 bit per memorizzare un informazione di 32 bit, sprecando in questo modo 4 byte.

Un’altra possibile soluzione sarebbe quella di memorizzare gli indirizzi IP come semplice testo: anche questa soluzione è da scartare immediatamente in quanto un comune indirizzo IP come 208.149.203.226 avrebbe richiesto ben 15 byte di spazio a fronte dei 4 byte di informazione.

Allora quale soluzione adottare? La soluzione sta nel tipo di dati binary di SQL Server, che viene così definito:

Dati binari a lunghezza fissa con lunghezza di n byte, dove n rappresenta un valore compreso tra 1 e 8.000. Le dimensioni dello spazio di archiviazione corrispondono a n byte.

Per utilizzare questo tipo di dati da occorre però qualche artificio nel codice. Nel successivo esempio si fa riferimento ad ASP .Net ed in particolare al lingiaggio VB.Net. Lascio al lettore il semplice compito di adattare questo codice nel linguaggio di suo interesse (C#, Java, ecc..).

Il codice per l’inserimento di dati in un campo binary è presentato di seguito.

' Spezzo l'Indirizzo IP in un array di stringhe con il metodo Split()
Dim StringIpAddress() As String = IpAddress.Split(".")

' Coverto l'array di stringhe in un array di Byte
Dim ByteIpAddress(4) As Byte
ByteIpAddress(0) = CType(StringIpAddress(0), Byte)
ByteIpAddress(1) = CType(StringIpAddress(1), Byte)
ByteIpAddress(2) = CType(StringIpAddress(2), Byte)
ByteIpAddress(3) = CType(StringIpAddress(3), Byte)

' Ora la variabile ByteIpAddress è pronta per essere inserita nel DB..

Dim SqlIpAddressParam As New SqlClient.SqlParameter("@SqlIpAddressParam",SqlDbType.Binary, 4)

SqlIpAddressParam.Value = ByteIpAddress

In questo codice l’indirizzo IP nella forma dotted contenuto nella variabile IpAddress viene inserito in un array di stringhe attraverso il metodo Split().

Successivamente l’array di stringhe viene convertito in un array di Byte. A questo punto l’indirizzo IP è pronto per essere inserito in un campo binary(4) di SQL Server.

(C) Alessio Luffarelli