MySQL does not provide special datatype or operators for IP addresses, but has two functions, that convert IP addresses to and from integers. In order to lookup addresses in a subnet, an efficient index range scan query could be used:
SELECT ip FROM table WHERE ip BETWEEN INET_NTOA("213.197.137.0") AND INET_NTOA("213.197.137.255")
In order to make it easier, we can have several handy functions, that simplify the task a bit:
SELECT ip FROM table WHERE ip BETWEEN inet_aton_net("213.197.137.3/24") AND inet_aton_bc("213.197.137.3/24")
I intentionally didn’t create/use function that would check IPs existence in network, as optimizer wouldn’t know it can be converted to efficient range scan, though, some operators like… LIKE are optimized properly.
CREATE FUNCTION inet_aton_net (ip VARCHAR(18)) RETURNS INTEGER UNSIGNED DETERMINISTIC BEGIN DECLARE nm INTEGER UNSIGNED DEFAULT 0; SET nm=32-SUBSTRING(ip,LOCATE("/",ip)+1); RETURN -- shift right and left looses host bits INET_ATON(LEFT(ip,LOCATE("/",ip)-1)) >> nm << nm; END
CREATE FUNCTION inet_aton_bc (ip VARCHAR(18)) RETURNS INTEGER UNSIGNED DETERMINISTIC BEGIN DECLARE nm INTEGER UNSIGNED DEFAULT 0; SET nm=SUBSTRING(ip,LOCATE("/",ip)+1); RETURN -- ip ORed with inverse netmask provides broadcast address INET_ATON(LEFT(ip,LOCATE("/",ip)-1)) | (4294967295>>nm); END