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でdatetime型データの〇日後を取得する方法(DATEDIFF)
MySQLでdatetime型データがあり、何日経過しているかを取得し、〇日経過 ...
-
-
MySQLで全国の市区町村のデータを入手し、抽出する方法
都道府県と市区町村が連携したセレクトメニューを作成したかった。具体的には大阪府を ...
-
-
MySQLにて指定したカラムがNULLもしくは空の場合、あらかじめ決めておいた内容で表示する方法
何らかのフォームとMySQLを組み合わせた際に任意入力の項目はそのカラムがNUL ...
-
-
ON DUPLICATE KEY UPDATE後にinsert_idを取得すると結果が0になる
MySQLでON DUPLICATE KEY UPDATE句指定し、データの登録 ...
-
-
MySQLでROW_NUMBER関数を使用してグループ毎に連番を設定する方法
以前にMySQLでオートインクリメントを使用せずにグループ毎に連番を設定する方法 ...