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
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'))
Ne veri türü SQL Server 2005'te telefo...
Nasıl tarih sadece SQL Server datetime...
Hangi MySQL boolean değerleri saklamak...
MySQL veritabanı enlem / boylam saklar...
C para için kullanılacak en iyi veri t...