MySQLでIPを整数値としてカラムに格納する
2024/02/25
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の投稿だとかデータ量が多いデータベースになりがちなので、検索速度とか考えると今回の方法を使っていくべきだと思われる。
関連記事
-
-
MySQLでカラム数の異なるテーブルを結合する(UNION)
MySQLでカラム数の異なるテーブル同士をUNIONで結合させたかった。ただ、何 ...
-
-
MySQLでdatetime型のカラムをdate型やtime型に変換して検索する方法
MySQLでdatetime型のカラムがあり、そちらをdate型やtime型に変 ...
-
-
MySQLでLIKE検索時に大文字・小文字・半角・全角全て区別したい
以前にMySQLであいまい検索時に大文字小文字は区別しないが、それ以外は全て区別 ...
-
-
MySQLで月別に集計を行う。あと日付時刻関数。
現在進行形でやっているデータ集計系だけど 新たな発見があったのでメモ。 ■日付時 ...
-
-
MySQLで直近に挿入したオートインクリメントの値と次回挿入する値を取得する方法
phpとmysqliを使っている中で次回挿入するオートインクリメントの値と、前回 ...