勉強したことのメモ

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で一連の処理を関数のように実行できるストアドプロシージャの設定と利用方法

MySQL関連のサイトを見ていた際にストアドプロシージャが云々というページがあっ ...

MySQLでtime型データからint型データの減算を行い、減算後のデータで条件検索する方法

MySQLでtime型データからint型データの減算を行い、減算後のデータを検索 ...

プリペアドステートメント

個人的に得た内容として、SQL文だけ先にDBに送って、 変数は後で送る。だからS ...

MySQLでdatetime型のカラムから秒は省いて検索する方法

MySQLでdatetime型のカラムに対して「2022-10-07 10:30 ...

MySQLiでINSERT文

MySQLiでINSERT文 ■ソース $mysqli = new mysqli ...