2014-06-12 14 views
7

Ho una tabella che contiene due colonne ipStart e ipEndMySQL controlla se un indirizzo IP è nel raggio d'azione?

Questi due campi contengono una serie di indirizzi IP. Per esempio:

`ipStart` = 193.235.18.0 

e

ipEnd = 193.235.21.255 

voglio essere in grado di selezionare la riga con un IP che è all'interno della gamma, ad esempio:

193.235.19.255 

è possibile?

+2

Non lo farei in SQL. Fallo nella tua preferita linguaggio di programmazione che è il modo migliore. – cb0

+0

hai provato tra? SELEZIONA * DA Prodotti DOVE PREZZO TRA 10 E 20; – Dwza

+0

@ cb0 quindi vai su tutte le righe mysql nel programma? –

risposta

11

Prova questa

SELECT * 
FROM TABLE_NAME 
WHERE (INET_ATON("193.235.19.255") BETWEEN INET_ATON(ipStart) AND INET_ATON(ipEnd)); 
+0

Quanto "pesante" sarebbe questo in un database contenente oltre 60 mil record? – Alosyius

+3

Molto pesante in quanto non verrà utilizzato alcun indice. Meglio avere IP come valori numerici nel DB, quindi creare un indice su di essi. –

+0

Quindi memorizzerei: 193.235.18.0 come segue: 193235180? – Alosyius

2

Per spiegare la conversione di un indirizzo IP ad un numero che alcune risposte hanno fatto affidamento su (e che sono d'accordo con).

L'indirizzo IP deve essere trattato come un numero a 32 bit invece di 4 8 ​​numeri di bit

Per esempio l'indirizzo IP

193.235.18.0

convertito in binario: -

11000001.11101011.00010010.00000000

che si traduce in (cioè, prendere i punti out): -

di lavoro che fuori si ottiene: -

1 * 2147483648 = 2147483648 
1 * 1073741824 = 1073741824 
0 * 536870912 = 0 
0 * 268435456 = 0 
0 * 134217728 = 0 
0 * 67108864 = 0 
0 * 33554432 = 0 
1 * 16777216 = 16777216 
1 * 8388608 = 8388608 
1 * 4194304 = 4194304 
1 * 2097152 = 2097152 
0 * 1048576 = 0 
1 * 524288 = 524288 
0 * 262144 = 0 
1 * 131072 = 131072 
1 * 65536 = 65536 
0 * 32768 = 0 
0 * 16384 = 0 
0 * 8192 = 0 
1 * 4096 = 4096 
0 * 2048 = 0 
0 * 1024 = 0 
1 * 512 = 512 
0 * 256 = 0 
0 * 128 = 0 
0 * 64 = 0 
0 * 32 = 0 
0 * 16 = 0 
0 * 8 = 0 
0 * 4 = 0 
0 * 2 = 0 
0 * 1 = 0 

Aggiunta di quelli insieme si ottiene 3253408256

È una scorciatoia che un po 'trattando l'indirizzo IP originale come base 256 il numero . In modo da avere 0 unità, 18 delle 256S, 235 di 65536 (vale a dire, 256 * 256) e 193 di (vale a dire, 256 * 256 * 256)

* 1 + * 256 + * 256 * 256 + * 256 * 256 * 256

La funzione INET_ATON citata fa questo per voi.

+3

Qualche idea su come supportare IPv6? :) Oh, c'è 'INET6_ATON()' ... –