sql >> Databáze >  >> RDS >> Sqlserver

Datový typ pro ukládání IP adresy na SQL Server

Technicky správný způsob ukládání IPv4 je binární(4), protože to je to, co ve skutečnosti je (ne, dokonce ani INT32/INT(4), číselná textová forma, kterou všichni známe a milujeme (255.255.255.255), je prostě převod zobrazení jeho binárního obsahu).

Pokud to uděláte tímto způsobem, budete chtít funkce převést do az formátu textového zobrazení:

Zde je návod, jak převést textový formulář zobrazení na binární:

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

A zde je návod, jak převést binární kód zpět do textové formy zobrazení:

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

Zde je ukázka, jak je používat:

SELECT dbo.fnBinaryIPv4('192.65.68.201')
--should return 0xC04144C9
go

SELECT dbo.fnDisplayIPv4( 0xC04144C9 )
-- should return '192.65.68.201'
go

A konečně, při vyhledávání a porovnávání vždy používejte binární formu, pokud chcete mít možnost využít své indexy.

AKTUALIZACE:

Chtěl jsem dodat, že jedním ze způsobů, jak řešit inherentní výkonnostní problémy skalárních UDF na SQL Serveru, ale stále zachovat opětovné použití kódu funkce, je místo toho použít iTVF (funkce s inline tabulkou). Zde je návod, jak lze první výše uvedenou funkci (řetězec na binární) přepsat jako 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

Zde je to v příkladu:

SELECT bin FROM dbo.fnBinaryIPv4('192.65.68.201')
--should return 0xC04144C9
go

A zde je návod, jak byste jej použili v INSERT

INSERT INTo myIpTable
SELECT {other_column_values,...},
       (SELECT bin FROM dbo.itvfBinaryIPv4('192.65.68.201'))


  1. SQL Server 2005 – Exportujte tabulku programově (spusťte soubor .sql a znovu ji vytvořte)

  2. Migrace schématu:Vztah ke hvězdě

  3. Nelze dešifrovat pomocí pgcrypto z AES-256-CBC, ale AES-128-CBC je v pořádku

  4. Převést „smalldatetime“ na „datetime2“ v SQL Server (příklady T-SQL)