Quando si ha a che fare con tabelle Mysql che contengono valori come gli indirizzi ip, spesso il loro ordinamento, in maniera crescente o descrescente, è un problema gravoso. Infatti se si lancia il seguente comando SQL:
si otterrà un risultato simile a questo:
+—————+
| ip |
+—————+
| 67.10.151.113 |
| 68.88.231.1 |
| 68.88.231.10 |
| 68.88.231.2 |
| 68.88.231.22 |
| 68.88.231.23 |
| 68.88.231.24 |
| 68.88.231.25 |
| 68.88.231.26 |
| 68.88.231.27 |
| 68.88.231.28 |
| 68.88.231.29 |
| 68.88.231.3 |
| 68.88.231.30 |
+—————+
Come vedete, nonostante nella query SQL si sia esplicitamente dichiarato di voler ordinare il risultato della select per il campo IP in maniera ascendente, in realtà il risultato finale è parziale poiché alcuni gruppi di valori sono effettivamente ordinati tra di loro mentre altri sembrano essere inseriti un po’ alla rinfusa. Per l’occhio più allenato, è facile intuire che questo risultato è tipico di un ordinamento testuale.
Il problema, infatti, è che non esiste un tipo di campo adatto ad un valore come l’ip address e, quindi, quando si devono configurare i campi un tabella, si è costretti ad assegnare una proprietà TESTO sul campo assegnato all’indirizzo ip (visto che la proprietà numerica di un campi mysql, anche se a prima vista potrebbe essere la più adatta, non supporta, come ovvio, la presenza di più di un punto decimale). Il che comporta che l’ordinamento avverrà come qualsiasi campo testuale, ovvero rispettando la tabella dei codici ascii. Ciò significa ritrovarsi, per esempio, il valore con .29 finale che è sempre seguito dal valore .3!
Soluzione 1: Inserire gli zeri
Per tutti i webmaster, questo problema di formattazione è davvero ostico da gestire poiché si presenta per ognuna delle 4 parti di cui è composto un indirizzo ip e una soluzione rapida, ma davvero sgradevole dal punto di vista estetico (anche se perfettamente funzionale) è di inserire tanti zeri quanti ne servono per raggiungere le 3 cifre di ogni parte dell’indirizzo ip. Per cui, per esempio, il valore 68.88.231.27 diverrebbe 068.088.231.027.
In questo modo, il risultato della query SQL sarebbe:
+—————+
| ip |
+—————+
| 067.010.151.113 |
| 068.088.231.001 |
| 068.088.231.002 |
| 068.088.231.003 |
| 068.088.231.010 |
| 068.088.231.022 |
| 068.088.231.023 |
| 068.088.231.024 |
| 068.088.231.025 |
| 068.088.231.026 |
| 068.088.231.027 |
| 068.088.231.028 |
| 068.088.231.029 |
| 068.088.231.030 |
+—————+
In realtà, se questa soluzione non vi piace, per risolvere questo annoso problema, a venire in vostro aiuto esiste una comoda funzione Mysql di nome: INET_ATON (A.TO.N = Address TO Number), che consente di convertire un indirizzo IP nel suo corrispettivo decimale.
In quanti modi può essere scritto un indirizzo IP
Infatti, come noto, un indirizzo IP è in realtà numero a 32 bit che, convenzionalmente, è rappresentato (oltre che da una serie di 32 uno e zero) tramite una più mnemonica notazione decimale (decimal dotted notation), che si ottiene suddividendo il numero binario corrispondente all’indirizzo IP in gruppi da 8 bit e trasformando ogni gruppo di 8 bit nel corrispondente valore decimale, ottenendo, quindi, i quattro valori decimali , separati l’uno dall’altro per mezzo di un punto.
Per rendere più chiaro l’esempio, facciamo un ping all’indirizzo di google.it
Pinging google.it [66.249.93.104] with 32 bytes of data:
Reply from 66.249.93.104: bytes=32 time=29ms TTL=242
Reply from 66.249.93.104: bytes=32 time=30ms TTL=242Ping statistics for 66.249.93.104:
Packets: Sent = 2, Received = 2, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 29ms, Maximum = 30ms, Average = 29ms
ed otterremo il suo indirizzo IP: 66.249.93.104
In realtà, questo indirizzo IP, a seconda della notazione usata, può essere scritto in varie maniere.
Per esempio:
IP Dotted Quad: 66.249.93.104
IP Binary: 01000010111110010101110101101000
IP Hex: 42F95D68
IP Decimal: 1123638632
Ora sulla barra degli indirizzi del vostro brower preferito potete scrivere indifferentemente una delle seguenti URL (anche se corretta come conversione, in realtà la notazione binaria non viene interpretata dai browser o quando si deve fare un ping remoto) e vedrete, in ogni caso, la homepage di Google.it:
http://66.249.93.104
http://0x42F95D68
http://ob01000010111110010101110101101000
http://1123638632
I prefissi inseriti servono a dire al browser in che notazione è stata scritta la url; per cui 0x indica la notazione esadecimale (Hex), 0b quella binaria (Binary) e 0 quella ottale (Octal).
Soluzione 2: la funzione Mysql INET_ATON
Ora, dopo questa spiegazione, sara facile capire che una funzione come INET_ATON (A.TO.N = Address TO Number) in grado di convertire un indirizzo IP in notazione decimale è veramente molto potente. Infatti, sarà sufficiente lasciare inviariati i valori del campo IP e convertirli in decimale solo nel momento in cui si esegue la query per effettuare il corretto ordinamento.
In definitiva, lanciando una query del tipo:
otterremo finalmente il risultato sperato
+————+—————+
| bin_ip | ip |
+————+—————+
| 1124767601 | 67.10.151.113 |
| 1146676993 | 68.88.231.1 |
| 1146676994 | 68.88.231.2 |
| 1146676995 | 68.88.231.3 |
| 1146677002 | 68.88.231.10 |
| 1146677014 | 68.88.231.22 |
| 1146677015 | 68.88.231.23 |
| 1146677016 | 68.88.231.24 |
| 1146677017 | 68.88.231.25 |
| 1146677018 | 68.88.231.26 |
| 1146677019 | 68.88.231.27 |
| 1146677020 | 68.88.231.28 |
| 1146677021 | 68.88.231.29 |
| 1146677022 | 68.88.231.30 |
+————+—————+
Se invece, dovete eseguire l’operazione inversa, potete usare la funzione reciproca INET_NTOA (N.TO.A = Number TO Address) che, quindi, è in grado di convertire un numero decimale nel suo equivalente indirizzo IP.
Commenti Recenti