MySQLでIPアドレスを数値として入れると変な値になる場合の対処方法
2024/02/25
MySQLでIPアドレスをINET_ATON関数を用いてINT型に変換し格納するというプログラムがあった。出力にPHPでlong2ip関数を用いてIPアドレスに変換したところ「127.255.255.255」という、ちょっと変なIPアドレスになっていた。以下に症状と原因と解決策。
症状
PHPで$_SERVER["REMOTE_ADDR"]を用いて閲覧者のIPを取得し、INET_ATON関数を用いてMySQLに格納。
↓↓
MySQLからIPを取り出しPHPのlong2ip関数を用いて表示させたところ「127.255.255.255」になる場合がある。また、すべてが上記IPになるわけではなく、正常に表示出来ている場合もある。
原因
MySQLのIPを格納するカラムにUNSIGNEDがついていなかったのが原因。
該当カラムをINT型にしており、INT型の範囲は「-2147483648~2147483647」の為、最大値の2147483647を超える数値は全て2147483647として格納される。2147483647をlong2ipで変換すると127.255.255.255になる。
尚、範囲内であれば問題ないので正常なIPアドレスとして表示される。
解決策
MySQLの該当カラムにUNSIGNEDをつける。Adminerからだと「テーブルの変更」から該当カラムの「設定」で「unsigned」を選択する。
unsignedって何?
カラムにunsignedをつけることで正の数しか格納できなくなる代わりに範囲が2倍になるとの事。
- unsigned無し → -2147483648~2147483647
- unsigned有り → 0~4294967295
となるっぽい。IPアドレスを数値へ変換した際に、
- 0.0.0.0 → 0
- 255.255.255.255 → 4294967295
になったのでunsignedをつけることで全てのIPアドレスが入るようになる。
関連記事
-
-
MySQLにてdatetime型のカラムを整形し「年月日のみ形式」または「秒のみ省いた形式」で表示する方法
MySQLにてdatetime型のカラムに登録日時等を格納しており、管理画面側で ...
-
-
MySQLで「Uncaught mysqli_sql_exception: BIGINT ~~」エラーの対応方法
MySQLにて「Uncaught mysqli_sql_exception: B ...
-
-
PHP / MySQLで2038年問題の対策
先日打ち合わせの際に「タイムスタンプを使ってユニークキーに云々~~」といったよう ...
-
-
MySQLのview(ビュー)で仮想的なテーブルを作成する方法
MySQL関連のサイトを見ているとview(ビュー)が云々という記事を見かけた。 ...
-
-
MySQLでSELECT時に数値を3桁ずつのカンマ区切りに変換する方法
MySQLで商品価格のような数値の値を3桁ずつのカンマ区切りで取り出したいという ...