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

  • Helen Bradley

    Helen Bradle

    4 Mart 2008
  • Jabari Johnson

    Jabari Johns

    18 Ocak 2008
  • soyacincautv

    soyacincautv

    14 NİSAN 2010