Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में IP पता संग्रहीत करने के लिए डेटाटाइप

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'))


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर प्रबंधन स्टूडियो में वास्तविक CSV प्रारूप में निर्यात आउटपुट कैसे प्राप्त करें?

  2. SQL सर्वर में भाषा सेटिंग्स आपके FORMAT () परिणामों को कैसे प्रभावित कर सकती हैं (T-SQL उदाहरण)

  3. SQL सर्वर चलाने वाले दो डॉकटर कंटेनरों के बीच एक लिंक्ड सर्वर बनाएँ (T-SQL उदाहरण)

  4. अधिक उन्नत क्वेरी चलाते समय ऑब्जेक्ट बंद होने पर ऑपरेशन की अनुमति नहीं है

  5. तालिका नाम और तालिका के स्कीमा के साथ SQL सर्वर डेटाबेस में सभी ट्रिगर्स को सूचीबद्ध करने की आवश्यकता है