2010-04-24 5 views
3

J'ai une configuration de table MySQL comme suit:Correspondance d'une adresse IP avec une plage IP?

+---------------+-------------+------+-----+---------+----------------+ 
| Field   | Type  | Null | Key | Default | Extra   | 
+---------------+-------------+------+-----+---------+----------------+ 
| ipaddress_s | varchar(15) | YES | MUL | NULL |    | 
| ipaddress_e | varchar(16) | YES |  | NULL |    | 
+---------------+-------------+------+-----+---------+----------------+ 

où, ipaddress_s et ipaddress_e ressembler à: 4.100.159.0-4.100.159.255

Maintenant, est-il un moyen que je peux réellement obtenir la ligne qui contient une adresse IP donnée? Par exemple, étant donné l'adresse IP: "4.100.159.5", je veux que la ligne ci-dessus soit retournée. J'essaie donc d'une requête qui ressemble à quelque chose comme ça (mais bien sûr, cela est faux parce que dans ce qui suit je considérais les adresses IP sous forme de chaînes):

SELECT * FROM ranges WHERE ipaddress_s<"4.100.159.5" AND ipaddress_e>"4.100.159.5" 

Toutes les suggestions?

Répondre

8

INET_ATON (expr) va changer une chaîne d'adresse IP en une adresse numérique que vous pouvez utiliser pour la comparaison.

http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton

SELECT * FROM ranges WHERE INET_ATON(ipaddress_s)<INET_ATON('4.100.159.0') AND INET_ATON(ipaddress_e)>INET_ATON('4.100.159.5') 
+0

Merci! Je ne savais même pas que ces fonctions existaient! – Legend

+1

Oui ... si les performances sont un problème, vous pouvez stocker les adresses dans la base de données comme des entiers en premier lieu. – WhirlWind

+0

Ouais .. En train de déposer cette table et en créer une nouvelle :) – Legend