[解決済み] SQL Server で ip アドレスを格納するためのデータ型
2022-09-16 08:35:15
質問
SQL Server で IP Address を格納するために、どのようなデータ型を選択すればよいですか。
正しいデータ型を選択することで、IP アドレスでフィルタリングすることは十分に簡単でしょうか。
どのように解決するのですか?
IPv4 を格納する技術的に正しい方法は binary(4) であり、それが実際のものだからです (いいえ、INT32/INT(4) でもなく、私たちが知っていて大好きな数値テキスト形式 (255.255.255.255) はそのバイナリ コンテンツの単なる表示変換にすぎません)。
この方法で行う場合、テキスト表示形式との間で変換するための関数が必要になります。
ここでは、テキスト表示形式をバイナリに変換する方法を説明します。
CREATE FUNCTION dbo.fnBinaryIPv4(@ip AS VARCHAR(15)) RETURNS BINARY(4)
AS
BEGIN
DECLARE @bin AS BINARY(4)
SELECT @bin = CAST( CAST( PARSENAME( @ip, 4 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 3 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 2 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 1 ) AS INTEGER) AS BINARY(1))
RETURN @bin
END
go
そして、バイナリをテキスト表示形式に戻す方法を説明します。
CREATE FUNCTION dbo.fnDisplayIPv4(@ip AS BINARY(4)) RETURNS VARCHAR(15)
AS
BEGIN
DECLARE @str AS VARCHAR(15)
SELECT @str = CAST( CAST( SUBSTRING( @ip, 1, 1) AS INTEGER) AS VARCHAR(3) ) + '.'
+ CAST( CAST( SUBSTRING( @ip, 2, 1) AS INTEGER) AS VARCHAR(3) ) + '.'
+ CAST( CAST( SUBSTRING( @ip, 3, 1) AS INTEGER) AS VARCHAR(3) ) + '.'
+ CAST( CAST( SUBSTRING( @ip, 4, 1) AS INTEGER) AS VARCHAR(3) );
RETURN @str
END;
go
使い方のデモを紹介します。
SELECT dbo.fnBinaryIPv4('192.65.68.201')
--should return 0xC04144C9
go
SELECT dbo.fnDisplayIPv4( 0xC04144C9 )
-- should return '192.65.68.201'
go
最後に、ルックアップや比較を行う場合、インデックスを活用したいのであれば、常にバイナリ形式を使用することです。
UPDATEです。
SQL Server におけるスカラー UDF の固有のパフォーマンス問題に対処しつつ、関数のコードの再利用を維持する 1 つの方法は、代わりに iTVF (inline table-valued function) を使用することであることを追加したいと思います。 ここでは、上記の最初の関数(string to binary)をiTVFとしてどのように書き直すことができるかを説明します。
CREATE FUNCTION dbo.itvfBinaryIPv4(@ip AS VARCHAR(15)) RETURNS TABLE
AS RETURN (
SELECT CAST(
CAST( CAST( PARSENAME( @ip, 4 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 3 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 2 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 1 ) AS INTEGER) AS BINARY(1))
AS BINARY(4)) As bin
)
go
例ではこうです。
SELECT bin FROM dbo.fnBinaryIPv4('192.65.68.201')
--should return 0xC04144C9
go
そして、INSERTでの使い方は以下の通りです。
INSERT INTo myIpTable
SELECT {other_column_values,...},
(SELECT bin FROM dbo.itvfBinaryIPv4('192.65.68.201'))
関連
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] SQL Server テーブルにカラムが存在するかどうかを確認する方法は?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] SQL ServerにおけるLEFT JOINとLEFT OUTER JOINの比較
-
[解決済み] データベース内の全テーブルのサイズを取得する
-
[解決済み] SQL ServerでJOINを使用してUPDATE文を実行するにはどうすればよいですか?
-
[解決済み] SQL Server にテーブルが存在するかどうかを確認する
-
[解決済み] SQL Server における DateTime2 と DateTime の比較
-
[解決済み] SQL Server の DataTypes に相当する C# の機能
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】各GROUP BY式は、外部参照でない列を少なくとも1つ含む必要があります。
-
[解決済み] サブレポートが表示されない。サブレポートは別々に動作します - メインレポートとは連動しません
-
[解決済み] SQL Server: caseステートメントでUniqueIdentifierを文字列に変換する
-
[解決済み] オペランドタイプの衝突
-
[解決済み] create関数は、バッチ内の唯一のステートメントでなければなりません。
-
[解決済み] 監査失敗、クレデンシャル検証 4776
-
[解決済み] データベースとスキーマの違い
-
[解決済み] 条件付きJOINステートメント SQL Server
-
[解決済み] SQL Serverでマテリアライズド・ビューを作成する方法は?
-
[解決済み】クライアントのIPアドレスの最大長【重複あり