勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

MySQLでIPを整数値としてカラムに格納する

   2024/02/25  PHP MySQL

MySQLでIPを整数値としてカラムに格納しているケースがあった。今までIPが必要な場合はvarcharとかで格納していたので、驚いた。MySQLでの格納及び出力方法とPHPでも同様の方法のメモ。

 

MySQL

ソースコード

//データの格納
INSERT INTO ip_test 
    (ip) 
VALUES 
    ( INET_ATON('173.194.120.71') ),
    ( INET_ATON('183.79.135.206') )

//データをそのまま出力
mysql> select ip from ip_test;
+------------+
| ip         |
+------------+
| 2915203143 |
| 3075442638 |
+------------+

//データをIPとして出力
mysql> select INET_NTOA(ip) AS ip from ip_test;
+----------------+
| ip             |
+----------------+
| 173.194.120.71 |
| 183.79.135.206 |
+----------------+

入力時はINET_ATON関数を、出力時は INET_NTOA関数を用いる。

リファレンス

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

 

PHP

ソースコード

<?php
//データはMySQLの方で作ったものを流用
$sql = '
    SELECT ip 
    FROM ip_test 
';
$row = $mysqli->query($sql);
while ($rs = $row->fetch_array(MYSQLI_ASSOC)) {
    $data[] = $rs['ip']; //そのまま出力
    $data2[] = long2ip($rs['ip']); //IPとして出力
}
var_dump($data); //array(2) { [0]=> string(10) "2915203143" [1]=> string(10) "3075442638" } 
var_dump($data2); //array(2) { [0]=> string(14) "173.194.120.71" [1]=> string(14) "183.79.135.206" } 

foreach( $data2 as $val ){
    $data3[] = ip2long($val); //IPを整数に変換
}

var_dump($data3); //array(2) { [0]=> int(2915203143) [1]=> int(3075442638) }

入力時はip2long関数を、出力時はlong2ip関数を用いる。

リファレンス

http://php.net/manual/ja/function.ip2long.php

http://php.net/manual/ja/function.long2ip.php

 

その他

varcharやtext型よりもint型の方が色々と便利。特にIPを入れるということはログ系とかBBSの投稿だとかデータ量が多いデータベースになりがちなので、検索速度とか考えると今回の方法を使っていくべきだと思われる。

 - PHP MySQL

  関連記事

MySQLで歯抜けになっているint型の数値を取得する

MySQLで歯抜けになっているシーケンス番号を 取得したいケースがあった。 ■ソ ...

MySQLでオートインクリメントを使用せずにグループ毎に連番を設定する方法

MySQLでオートインクリメントを使用せずにグループ毎で連番を割り振りたかった。 ...

MySQLに保存したデータをJSON形式で取得する方法

MySQLに保存したデータをJSON形式で利用したいということがたまにある(Ja ...

MySQLで文字列を置換する方法

MySQLで文字列の置換を行いたかった。以下に方法をメモ。   目次1 ...

MySQLにてSELECT時にdate型のカラムから和暦を計算し表示する方法

MySQLにdate型のカラムに誕生年月日が格納されており、そこから和暦を計算し ...