2014年10月26日

MySQL:IPアドレスを保存するカラムのデータ型

MySQLにクライアントのIPv4アドレスを保存する必要ができました。そこでテーブルを作ることになりましたが、IPアドレス用カラムはどのデータ型が良いか疑問に思ったので調べてみました。

今までの仕事で何度か稼働中のMySQLを使うことはありましたが、ほとんどの場合、IPアドレスはVARCHAR型で保存していました。(他の人の設計)

VARCHAR型でも問題ありませんでしたが、今回はPostgreSQLに専用のデータ型があることを思い出してしまいました。そのため、MySQLにも無いのかな?と疑問に思い、調べてみることにしました。

例 PostgreSQLのIPアドレス用のデータ型
ネットワークアドレス型 (PostgreSQL 9.3.2文書)

調べた結果、MySQLは文字列以外だとUNSIGNED INTEGERか、VARBINARY(4)で、INET_ATON()やINET_NTOA()関数と一緒に使うのが良さそうでした。
INET_ATON() (MySQL 5.6 Reference Manual)

IPv6の場合は、データ型にVARCHAR(16)を指定して、INET6_ATON()とINET6_NTOA()関数を使うようです。ただし、INET6_ATON()とINET6_NTOA()はMySQL 5.6.3から追加されました。そのため、5.6.3以前のバージョンでは使用できないそうです。試しに5.1でINET6_ATON()を使うとエラーになりました。
mysql> SELECT INET6_ATON('::1');
ERROR 1305 (42000): FUNCTION test.INET6_ATON does not exist

参考
IPv6 and internationalized domain (IDNA) functions for MySQL
Changes in MySQL 5.6.3 (2011-10-03, Milestone 6)

これらの結果は以下にまとめました。
MySQL IPアドレス用カラム

追記
MySQLへのIPv4アドレス保存を、PHPで試してみました。また、PHPにもIPv4アドレスの文字列、整数変換用の関数ip2long()、long2ip()がありますので、合わせてテストしてみました。
ip2long、long2ipのテスト
posted by jun1 at 14:21| Comment(0) | TrackBack(0) | データベース