web-dev-qa-db-ja.com

MySQLにIPアドレスを保存する最も効率的な方法

MySQLでIPアドレスを保存および取得する最も効率的な方法は何ですか?今私はやっています:

_SELECT * FROM logins WHERE ip = '1.2.3.4'
_

ここで、ipはVARCHAR(15)フィールドです。

これを行うためのより良い方法はありますか?

68
ensnare

IPv4アドレス の場合、それらを_int unsigned_として保存し、 INET_ATON() および INET_NTOA() 数値からIPアドレスを返す関数、およびその逆の関数。

例:

_SELECT INET_ATON('127.0.0.1');

+------------------------+
| INET_ATON('127.0.0.1') |
+------------------------+
|             2130706433 | 
+------------------------+
1 row in set (0.00 sec)


SELECT INET_NTOA('2130706433');

+-------------------------+
| INET_NTOA('2130706433') |
+-------------------------+
| 127.0.0.1               | 
+-------------------------+
1 row in set (0.02 sec)
_
106
Daniel Vassallo

IPv4アドレスのみを保存する場合は、32ビット整数フィールドに保存できます。

IPv6もサポートしたい場合、文字列はおそらく最も読みやすい/使いやすい方法です(技術的には16バイトのVARBINARY()フィールドに保存することもできますが、 「手動で」IPアドレスで選択するSQLステートメントを生成します)

54
Dean Harding

最も重要なことは、列がインデックス化されていることを確認することです。これは、IPアドレスに基づいて、クエリに大きな違いを作ることができます。

4
Mark Byers

作業が最も簡単なものは何でも。サイズまたは速度の問題は、プロファイリングによって問題であることがわかるまで問題ではありません。場合によっては、部分一致を行う必要がある場合、文字列を使用する方が簡単な場合があります。しかし、スペースまたはパフォーマンスの問題として、心配する本当の理由がない限り、心配しないでください。

2
DGM

多分整数値を整数フィールドに直接保存しますか? IPアドレスは基本的に4つの「ショート」です。

確認してください: http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip

1
Brian Dilley