勉強したことのメモ

webプログラマ見習いが勉強したことのメモ。

MySQLでIPアドレスを数値として入れると変になる

   

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

  関連記事

msyql-image
MySQLで構文エラーが出た際は予約語も疑う

MySQLで構文エラーが発生しており、チェックしたところ、どう見ても構文的には間 ...

msyql-image
MySQLでユニークキーをはる

MySQLでseqとcodeみたいなものをあわせて ユニークキーをはりたかった。 ...

msyql-image
エックスサーバーでMySQLのサイズに注意

エックスサーバーで自動更新のログをMySQLに保存するようなシステムを動かしてい ...

msyql-image
MySQLの値について

既存プログラムの解析をしてて知ったこと。 MySQLの構造で「int(11)」と ...

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

MySQLでIPを整数値としてカラムに格納しているケースがあった。今までIPが必 ...

msyql-image
MySQLで複数のテーブルを異なるデータベースと異なるカラムでJOIN

ちょっとややこしいんだけど、以下のような条件で3つのテーブルを結合したかった。 ...

msyql-image
MySQLでWhere句を使ってカラム指定でデータコピー

MySQLで大量のデータを保存しているテーブルがあり、そのデータを絞った上で尚且 ...

msyql-image
phpmyadminからプロセスの停止

重たいSQL文を叩いた際、どうにも処理できず メモリ使用率が100%から下がらな ...

msyql-image
SSH接続でMySQLにデータをインポートする

phpMyAdminが入っていなかったり、SQLファイルが大きかったりという理由 ...

msyql-image
mysqlでrootのパスワードが分からない場合

pleskで管理しているサーバがあり、mysqlのrootのパスワードが分からな ...