SQLサーバーにIPアドレスを保存するための最も適切なデータ型は何ですか? [複製]
-
10-07-2019 - |
質問
この質問にはすでに回答があります:
SQLサーバーにIPv4アドレスを保存するための最も推奨されるデータ型は何ですか?
それとも、誰かが既にユーザーSQLデータ型(.Netアセンブリ)を作成しているのでしょうか?
ソートは必要ありません。
解決
文字列として保存する場合に役立つ可能性のある、あまり使用されないSQL Server関数は PARSENAME
、ところで。 IPアドレス用には設計されていませんが、IPアドレスに最適です。以下の呼び出しは「14」を返します:
SELECT PARSENAME('123.234.23.14', 1)
(番号は右から左)。
他のヒント
通常、IPv4アドレスにはvarchar(15)を使用しますが、ゼロを埋めない限り、ソートするのは大変です。
過去にもINTとして保存しました。 System.Net.IPAddress
には GetAddressBytes
がありますIPアドレスを表す4バイトの配列としてIPアドレスを返すa>メソッド。次のC#コードを使用して、 IPAddress
から int
...
var ipAsInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);
これを使用したのは、重複アドレスを多く検索する必要があり、インデックスをできるだけ小さくしたかったためです。できるだけ早く。次に、アドレスをintから
オブジェクトでは、 GetBytes
メソッド < code> BitConverter を使用して、intをバイト配列として取得します。そのバイト配列を constructor に渡します IPAddress
はバイト配列を受け取り、戻ってきます IPAddress
あなたが始めたこと。
var myIp = new IPAddress(BitConverter.GetBytes(ipAsInt));
受け入れられた回答のこのコメントについて
パディングしない限り、それらをソートするのは大変 ゼロ。
SQL Server 2008のコツです(この本)
with ip_addresses as
(
SELECT '131.33.2.201' AS ip_address UNION ALL
SELECT '2.12.4.4' AS ip_address UNION ALL
SELECT '131.33.2.202' AS ip_address UNION ALL
SELECT '2.12.4.169' AS ip_address UNION ALL
SELECT '131.107.2.201' AS ip_address
)
select ip_address
from ip_addresses
ORDER BY CAST('/' + ip_address + '/' AS hierarchyid)
返品
ip_address
-------------
2.12.4.4
2.12.4.169
131.33.2.201
131.33.2.202
131.107.2.201
お気に入りの記事では、正規表現を使用してはならない理由について説明していますIPアドレスを解析します。彼らが話していることのほとんどは、IPアドレスのテキスト表現に非常に注意する必要がある理由を本当に説明しています。データベースで使用するデータ型を決定する前に読んでおくことをお勧めします。また、おそらくアプリの処理についても検討することをお勧めします(記事はPerlについて書かれていますが、どの言語にも役立ちます)。
最終的には、32ビットデータ型(または4つの8ビットデータ型)が最良の選択だと思います。
IPV4? int?またはtinyint x 4?
それは、単に保存と取得だけなのか、それとも広範囲の検索条件になるのかによって大きく異なります。
IPv6を忘れないでください-それらを保存する必要がある場合は、さらに多くのスペースが必要です-IPv4の32と比較して128ビット。
私はbigintを選びますが、人間に優しいバージョンに変換するにはヘルパーコードが必要になります。
私はここで同様の質問をたくさん読んでいますが、この1件の回答には他の回答の中で一番の回答はありません:&quot; IPv4アドレスの場合は、int unsignedとして保存し、 INET_ATON()およびINET_NTOA()関数は、数値からIPアドレスを返します。逆も同様です。&quot;上記のphp関数を使用することを決定しない限り、これはdbで使用するものだと思います。
最良の方法(IPのソートやその他の制御が不要な場合)は、 intとして保存します。varcharなどとして保存すると、単純な無実のintよりもパフォーマンスが大幅に低下します。
IPAddressプロパティがあります。アドレス
ですが、それは時代遅れです、IPクラスをソートしたり制御したりする必要がない場合、最良の方法は符号なし整数として保存することです(最大10進表現で 255.255.255.255
に等しい 0xffffffff
の値。
また、IPAddressクラスには、長い引数を受け取るコンストラクタがあります。
VSデバッガービジュアライザーによると、そのIPAddressクラス自体は、内部変数を1つの数値(バイト配列ではない)として格納します。
MS SQL Serverにユニットを保存する回避策の詳細を読む:
スペースを節約するために、値を処理する(範囲と一致または比較する)場合、 int
を使用します。 IPアドレスは実際には単なる32ビット値です。
値を保存して表示するだけの簡単なソリューションでは、 varchar(15)
を使用してIPアドレスの文字列表現を保存します。
4つのsmallint(または任意の小さい整数データ型)列(各オクテットに1つ)を作成することに成功しました。次に、それらを文字列として表示するビューを作成するか(表示用)、単純な演算子を作成して、誰がどのサブネットにいるかなどを判断できます。
これは非常に高速で(適切なインデックス付けを行う場合)、クエリも非常に簡単です(文字列操作は不要です!)。
IPアドレスには32ビットが含まれているため、LONGを使用して数値を保存できますか?
VARCHARを使用するほどスペースを無駄にすることはありませんが、使用する前に毎回IPにデコードする必要があり、コストとその遅延とオーバーヘッドは価値がないかもしれません。
MSSQLデータベースにIPv4アドレスを保存するための最も適切なデータ型は、 int
です。唯一の厄介な点は、表示/ソートのために点線表記に変換することです。したがって、これを自動化するビューを作成することをお勧めします。
おそらく varchar
または char
を使用します。
サイズを15に設定します。
引用 this :
CHAR(15)列にIPアドレスを保存します。保存するデータの量によっては、これは非常に無駄になります(ドットを保存する必要があるのはなぜですか?)。私
私は初心者@ php、sqlですが、sql dbに何かを保存する最も速い方法は、それをint値に変換してintとして保存することだと思います。
PHPで関数を使用しました-
function ip_convert() {
$ip = 私は初心者@ php、sqlですが、sql dbに何かを保存する最も速い方法は、それをint値に変換してintとして保存することだと思います。
PHPで関数を使用しました-
<*>
そして、すべてのドットをゼロに置き換えます。
次に、SQLからこのIPを使用する必要がある場合.if($ ip == ip_convert())
ただし、これはPHPを使用する場合のみです。
SERVER['REMOTE_ADDR'];
$intip = str_replace(".","0",$ip);
return $intip;
}
そして、すべてのドットをゼロに置き換えます。 次に、SQLからこのIPを使用する必要がある場合.if($ ip == ip_convert())
ただし、これはPHPを使用する場合のみです。