web-dev-qa-db-ja.com

クライアントIPアドレスの最大長

可能性のある複製:
IPv6アドレスのテキスト表現の最大長?

クライアントIPアドレスを保存するデータベース列の最大サイズとして何をお勧めしますか?現在16に設​​定していますが、IPv6などのIPアドレスよりも長いIPアドレスを取得できますか?

249

IPv4の場合、couldIPアドレスの4つの未加工バイトを保存する必要はありません(IPアドレスのピリオドの間の数字はそれぞれ0- 255、つまり1バイト)。しかし、その後、DBに出入りする翻訳を行う必要があり、面倒です。

IPv6アドレスは128ビットです(32ビットのIPv4アドレスとは対照的に)。それらは通常、コロンで区切られた4つの16進数の8つのグループとして書かれています:2001:0db8:85a3:0000:0000:8a2e:0370:7334。この形式でIPv6アドレスを保存するには、39文字が適切です。

編集:ただし、警告があります。IPv4にマップされたIPv6アドレスの詳細については、@ Deepakの回答を参照してください。 (正しいIPv6文字列の長さは45文字です。)

246
Matt Bridges

一般的な39文字のIPv6構造には注意点があります。 IPv4にマップされたIPv6アドレスの場合、文字列は(39文字よりも)長くなる可能性があります。これを示す例:

IPv6(39文字):

ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD

IPv4-mapped IPv6(45文字):

ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:192.168.158.190

注:最後の32ビット(IPv4アドレスに対応)には最大15文字が必要です(IPv4は1バイトの4つのグループを使用し、ドット(.文字)で区切られた0-255の範囲の4つの10進数としてフォーマットされます) 、最大値はDDD.DDD.DDD.DDDです。

したがって、正しい最大IPv6文字列長は45です。

これは実際に私が受講したIPv6トレーニングのクイズの質問でした。 (私たちは皆39と答えました!)

391
Deepak

標準表記でIPV6を処理する場合、4つの16進数の8つのグループがあります。

2001:0dc5:72a3:0000:0000:802e:3370:73E4

32桁の16進数+ 7つの区切り文字= 39文字。

注意:IPV6アドレスとしてマップされたIPV4アドレスも保持したい場合、 @-Deepakが示唆するように45文字を使用

24

3つすべての方法を試した人から取ってください... varchar(39)を使用してください

わずかに効率の悪いストレージは、挿入/更新時に変換し、どこにでも表示するときにフォーマットする必要があるという利点をはるかに上回ります。

10
Neil N

IPv6 Wikipedia の記事で説明されているように、

IPv6アドレスは通常、4つの16進数の8つのグループとして書き込まれ、各グループはコロン(:)で区切られます。

典型的なIPv6アドレス:

2001:0db8:85a3:0000:0000:8a2e:0370:7334

これは39文字です。 IPv6アドレスは128ビット長であるため、おそらくbinary(16)カラムを使用できますが、英数字表現に固執すると思います。

8

IPv4は次の形式の32ビットを使用します。

255.255.255.255

CHAR型の文字列として保存するだけなのか、数値型を使用するのかは、データ型に依存すると思います。

IPv6は128ビットを使用します。他の情報を含めない限り、それよりも長いIPはありません。

IPv6は、次のようにコロンで区切られた4桁の16進数のセットにグループ化されます(ウィキペディアから):

2001:0db8:85a3:0000:0000:8a2e:0370:7334

必要に応じて、39文字の長い文字列として安全に保存できます。ただし、アドレスを記述する他の速記方法もあります。ゼロのセットは、単一の0に切り捨てられるか、ゼロのセットが二重コロンで完全に非表示になります。

2
Chet

参照用に保存するだけの場合は、文字列として保存できますが、たとえばIPアドレスが何らかのテーブルにあるかどうかを確認するためにルックアップを行う場合は、「正規表現」が必要です。全体を(大きな)数に変換するのは正しいことです。 IPv4アドレスはlong int(32ビット)として保存できますが、IPv6アドレスを保存するには128ビットの数値が必要です。

たとえば、これらすべての文字列は実際には同じIPアドレスです:127.0.0.1、127.000.000.001、:: 1、0:0:0:0:0:0:0:1

2
user410119

IPアドレスを生データに圧縮できる場合、人々は文字について話します。

したがって、原則として、IPv4(32ビット)またはIPv6(128ビット)のみを使用するため、最大で128ビットのスペース、つまり128/8 = 16バイト

これは、推奨される39バイトよりはるかに少ないです(charsetがasciiであると仮定)。

そうは言っても、IPアドレスを生データとの間でデコードおよびエンコードする必要がありますが、それ自体は簡単なことです(32ビットIPのPHPのip2long()を参照してください)。

編集:inet_pton(およびその反対のinet_ntop())は必要なことを行い、両方のアドレスタイプで動作します。ただし、WindowsではPHP 5.3以降で使用可能です。

2
Christian