MySQLでIPアドレスを数値で記憶する方法

MySQLではIPアドレスを扱うための関数 INET_ATON(), INET_NTOA()があります。
INET_ATON()関数はIPアドレスを符号なし10進数に変換してくれます。
INET_NTOA()関数は符号なし10進数の数字をIPアドレスに変換してくれます。

 

IPアドレスをINET_ATON()関数にて数値データとして扱うには、符号なし整数のカラムを作成します。

mysql> CREATE TABLE sample( ip_address int(10) unsigned )

注意としてデータを格納するカラムは、UNSIGNED を指定し符号なしで作成します。
符号付き整数で作成した場合は正しくデータが格納されないので注意が必要です。

 

データを格納するには以下のようにします。

mysql> INSERT INTO sample VALUES(INET_ATON(‘192.168.10.10’));

SELECTで確認すると以下のような符号なし整数データで格納されていることが分かります。

mysql> SELECT ip_address FROM sample;
+ – – – – – – – +
| ip_address     |
+ – – – – – – – +
| 3232238090   |
+ – – – – – – – +

 

数値で格納された値をIPアドレスに戻し取得するにはINET_NTOA()関数をつかいます。

mysql> SELECT ip_address, INET_NTOA(ip_address) FROM sample;
+ – – – – – – – + – – – – – – – – – – – – – +
| ip_address     | INET_NTOA(ip_address)  |
+ – – – – – – – + – – – – – – – – – – – – – +
| 3232238090   | 192.168.10.10                 |
+ – – – – – – – + – – – – – – – – – – – – – +

 

データベースに格納されたIPアドレスは、範囲指定して取り出すこともできます。

例として、以下の内容がテーブルにある場合、

mysql> SELECT ip_address, INET_NTOA(ip_address) FROM sample;
+ – – – – – – – + – – – – – – – – – – – – – +
| ip_address     | INET_NTOA(ip_address)  |
+ – – – – – – – + – – – – – – – – – – – – – +
| 3232238090   | 192.168.10.10                 |
| 3232238346   | 192.168.11.10                 |
| 3232238280   | 192.168.10.200                |
| 3232238536   | 192.168.11.200                |
| 3232238436   | 192.168.11.100                |
| 3232238180   | 192.168.10.100                |
+ – – – – – – – + – – – – – – – – – – – – – +

範囲 192.168.10.10~192.168.11.100 に含まれるIPアドレスを取得するには以下のようにBETWEENを使い取得します。

mysql> SELECT ip_address, INET_NTOA(ip_address) FROM sample WHERE ip_address BETWEEN INET_ATON(‘192.168.10.200’) AND INET_ATON(‘192.168.11.100’);
+ – – – – – – – + – – – – – – – – – – – – – +
| ip_address     | INET_NTOA(ip_address)  |
+ – – – – – – – + – – – – – – – – – – – – – +
| 3232238346   | 192.168.11.10                 |
| 3232238280   | 192.168.10.200               |
| 3232238436   | 192.168.11.100               |
+ – – – – – – – + – – – – – – – – – – – – – +

 


2014年12月24日