IPアドレスをMySQLで比較する
はじめに
個人的なメモを確認していたら発掘したので書いておく。何かの役に立つかとか何故こんなことをメモしていたのかは不明… せっかくなので使ってみた。
やりかた
192.168.11.123 が 192.168.11.0/24 に入っているか調べたい。
IPアドレスをintにする。
INET_ATON('192.168.11.123') => 3232238459
INET_ATON('192.168.11.0') => 3232238336
両者のXORを取る
3232238459 ^ 3232238336 => 123
サブネット分をビットシフト 32 - 24 = 8
123 >> 8 => 0
0ならサブネット内にある
SQLにしてみる
SELECT (INET_ATON('192.168.11.123') ^ INET_ATON('192.168.11.0')) >> 8;
IPアドレスとサブネットを分割
SELECT SUBSTRING_INDEX('192.168.11.0/24', '/', 1);
192.168.11.0
SELECT SUBSTRING_INDEX('192.168.11.0/24', '/', -1);
24
全部合わせる
SELECT (INET_ATON('192.168.11.123') ^ INET_ATON(SUBSTRING_INDEX('192.168.11.0/24', '/', 1))) >> (32 - SUBSTRING_INDEX('192.168.11.0/24', '/', -1));
備考
サブネットマスクが24ビットとかなら LIKE '192.168.11.%'
とかでいいけど、23ビットだとめんどくさくなるのでこういうことを考えたんだと思う。