IPアドレスを保存する


25

すべての登録ユーザーのIPアドレスをデータベースに保存する必要があります。このような列に対して何文字を宣言すればよいのでしょうか?

IPv6もサポートする必要がありますか?ある場合、IPアドレスの最大長は?

回答:


27

文字列として保存しないでください。int unsigned列を使用し、INET_ATON()およびでINET_NTOA()それぞれ保存/取得します。知る限り、mysqlはipv6のINET_ *をサポートしていません。

コメントごとに編集

組み込み関数を使用してIPを整数に変換したり、整数からIPに変換したり(したがって、これらの整数をデータベースに格納したり)すると、それらのIPが自動的に検証されるという副作用があります。IPをVARCHAR(16)として保存するとします。いくつかのカスタム検証では、無効なIP(例として999.999.999.999など)を保存しないようにする必要があります。INET_ *関数がそれを処理します。


1
-1、IPアドレスは最大128ビットで、MySQLがサポートする最大の整数型は64ビットです。
ヘンドリックブルーマーマン

3
IPv4は32ビットです。彼が述べたように、128ビットはIPv6用であり、INET_ *のものはサポートしていません。
リチャード

1
IPv6アドレスについては、INET6_ATON()およびINET6_NTOA()関数を使用します。例を参照してください-rathishkumar.in/2017/08/how-to-store-ip-address-in-mysql.html
rathishDBA

6

おそらくIPv6の検討を開始する時期です。MySQLには、IPv6アドレスをバイナリ形式に変換する方法がありません。40文字の文字列は、通常のIPv6アドレスを処理します。40文字を超える可能性のある形式がありますが、実際には起こりそうにないものと考えます。

サイズから、7つの区切り文字で最大8つの4文字グループが存在するという情報からサイズを計算できます。異常な形式は、最後の2つのグループをIPv4形式のアドレスに置き換えます。アドレス圧縮なしで、最後の9文字を最大15文字に置き換えます。

ブロックを保存する場合、ブロックサイズの表示には、IPv4に必要な3文字ではなく4文字を使用できます。

取得するフォーマットが一貫していることを確認する必要がありますが、私が見たすべてのソフトウェアはアドレスに一貫したフォーマットを提供します。


2
私は完全に同意し、IPv6が来て、それはそれのために準備ができて良いでしょうY2Kのようにそれを待っていることにより:D
ジェフ

来るだけでなく、すでに私のシステムでここにいます。
-BillThor

6

PostgreSQLへの移行と、INETまたはCIDRデータ型の使用をお勧めします。

CREATE TABLE test ( test_id serial PRIMARY KEY, address inet );
INSERT INTO test ( address ) VALUES ( '1.2.3.4'::inet );
INSERT INTO test ( address ) VALUES ( 'a:b::c:d'::inet );
SELECT * FROM test;
 test_id | address  
---------+----------
       1 | 1.2.3.4
       2 | a:b::c:d

ネットワークにあるIPを取得するにはSELECT * FROMテストWHEREアドレス<< '1.2.3.0/24'::inet;
jkj

4

これは、MySQLメーリングリストの1つで作成された最良の回答です。読むIPアドレスを格納するためのベストFIELDTYPE ...

簡単に言うと、2番目に、INT(10)UNSIGNEDを使用することをお勧めします。

  1. 使用するメモリが少ない(4バイトのみ)
  2. 特に訪問者の出身国を探す場合、IP範囲のソートと検索に最適です。

したがって、192.168.10.50を使用する場合:

(192 * 2 ^ 24)+(168 * 2 ^ 16)+(10 * 2 ^ 8)+ 50 = 3232238130(結果は192.168.10.50)

MySQLでは、を直接使用 SELECT INET_ATON('192.168.10.50'); して取得でき 3232238130ます。

または

192 +(168 * 2 ^ 8)+(10 * 2 ^ 16)+(50 * 2 ^ 24)= 839559360(後方、結果は50.10.168.192)

MySQLでは、直接使用SELECT INET_NTOA(3232238130); して192.168.10.50戻ること ができ ます。


印象的、あなたのために+1!4バイトの符号なしシュアを使用すると、文字列操作をいつでも打つことができます。
-RolandoMySQLDBA

-1、IPアドレスは最大128ビットで、MySQLがサポートする最大の整数型は64ビットです。
ヘンドリックブルーマーマン

3
nhnb、IPv6は128ビットであるが、会話は、IPv4についてであるIS 32ビット。あなたの知識を主張する各コメント/回答にコメントする必要はありません。
アイ

あなたの答えは、それが古いインターネットプロトコルだけを扱っていることを言及していませんが、質問は最後に明示的にIPv6を言及しています。(少なくとも私の国では)最後の市長のインターネットプロバイダーがIPv6を今年の終わりまでにサポートすることを考えると、それを処理できないデータベース構造を設計することは非常に悪い考えです。
ヘンドリックブルーマーマン


1

最大15文字まで保存できます。VARCHAR(15)は16バイトであるため、使用しないでください(最初のバイトは文字列の長さを管理するため、取得と保存が遅くなります)。IPアドレスなどの場合は常にCHAR(15)を使用します。


IPアドレスの最大長は45文字です。
ヘンドリックブルーマーマン

CHARはスペースを埋めませんか?
ガイウス

0

回答についてコメントできません。stackoverflowでそれについて質問があります。そして、私は選択された答えに完全に同意します:2xBIGINTを使用することがおそらく現在のipv6にとって最良の方法です。

2 * BIGINTに行くことをお勧めしますが、それらが署名されていないことを確認してください。IPv6の/ 64アドレス境界には(/ 64が最小のネットブロックサイズであるため)それとうまく整合する、一種の自然な分割があります。

このbigintにipv4を保存することも可能です-それらのいずれかをNULLとしてマークするか、V4COMPAT形式を使用して

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.