SORU
6 EYLÜL 2009, Pazar


Veri türü SQL Server ıp adresi saklamak için

Ne veri türü SQL Server Ip Adresi saklamak için tercih etmeliyim?

Doğru seçerek veri türü kolay IP adresi tarafından filtre sonra olur mu?

CEVAP
6 EYLÜL 2009, Pazar


Bu teknik olarak doğru bir şekilde saklamak için IPv4 İkili(4), beri ne olduğunu aslında (hayır, bir an bile INT32/İNT(4)), sayısal metin oluşturan, bildiğimiz ve sevdiğimiz (255.255.255.255) sadece görüntü dönüştürme bu ikili içeriği.

Eğer bu şekilde yaparsanız, fonksiyonları ve metin-görüntü biçimine dönüştürmek istiyor:

İkili metin görüntüleme formu dönüştürmek için:

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

Ve burada ikili metin görüntülemek forma dönüştürmek için nasıl:

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

İşte bunları kullanmak için nasıl bir gösteri:

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

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

Aramaları ve karşılaştırır yaparken son olarak, her zaman eğer senin dizin kaldıraç olmak istiyorsanız ikili formu kullanın.


GÜNCELLEME:

İstediğimi elde etmek için bir yol Adres doğasında performans sorunları skaler UDF içinde SQL Server, ama yine de korumak kodu-yeniden bir işlev için kullanmak bir iTVF (satır içi tablo değerli işlev) yerine. İlk işlevi yukarıda (binary string) yeniden yazılabilir nasıl bir iTVF gibi:

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

İşte örnek:

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

Ve burada bir EKLEME bunu nasıl kullanırsınız

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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FASHTAG

    FASHTAG

    5 EYLÜL 2012
  • Jorrit Jongma

    Jorrit Jongm

    17 Ocak 2008
  • Matt Davis

    Matt Davis

    4 ŞUBAT 2006