sql >> データベース >  >> RDS >> Sqlserver

SQLServerに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
    

    最後に、ルックアップと比較を行うとき、インデックスを活用できるようにする場合は、常にバイナリ形式を使用してください。

    更新:

    SQL ServerのスカラーUDFに固有のパフォーマンスの問題に対処するために、その1つの方法を追加したかったのですが、関数のコードの再利用は、代わりにiTVF(インラインテーブル値関数)を使用することです。上記の最初の関数(文字列からバイナリ)を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'))
    


    1. MySQLデータベースとテーブルを修復する方法

    2. T-SQLのバグ、落とし穴、およびベストプラクティス–ピボットとピボット解除

    3. SQLでのコンマ区切りの結果

    4. PostgreSQLでのisnumeric()