Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Тип данни за съхраняване на IP адрес в SQL Server

Технически правилният начин за съхраняване на IPv4 е двоичен(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

И накрая, когато правите справки и сравнения, винаги използвайте двоичния формуляр, ако искате да можете да използвате вашите индекси.

АКТУАЛИЗАЦИЯ:

Исках да добавя, че един от начините за справяне с присъщите проблеми с производителността на скаларните UDFs в SQL Server, но все пак запазването на повторното използване на кода на функция е вместо това да се използва 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Автоматично събиране на данни за изпълнени задачи в MS SQL Server

  2. Разберете на каква операционна система работи SQL Server (пример за T-SQL)

  3. SQL Server 2016:Създайте потребител на база данни

  4. Преобразувайте „datetimeoffset“ в „datetime“ в SQL Server (T-SQL примери)

  5. Синтаксис на for-loop в SQL Server