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
अंत में, लुकअप और तुलना करते समय, यदि आप अपने इंडेक्स का लाभ उठाने में सक्षम होना चाहते हैं तो हमेशा बाइनरी फॉर्म का उपयोग करें।
अद्यतन:
मैं एसक्यूएल सर्वर में स्केलर यूडीएफ की अंतर्निहित प्रदर्शन समस्याओं को हल करने का एक तरीका जोड़ना चाहता था, लेकिन फिर भी एक फ़ंक्शन के कोड-पुन:उपयोग को बनाए रखना इसके बजाय एक आईटीवीएफ (इनलाइन टेबल-वैल्यू फ़ंक्शन) का उपयोग करना है। यहां बताया गया है कि कैसे ऊपर दिए गए पहले फ़ंक्शन (स्ट्रिंग टू बाइनरी) को 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'))