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

यूनिकोड से गैर-यूनिकोड रूपांतरण

यहाँ ध्यान देने योग्य कुछ बातें हैं:

  1. यदि आप यह देखना चाहते हैं कि वास्तव में कौन सा वर्ण है, तो आप मान को VARBINARY . में बदल सकते हैं जो आपको स्ट्रिंग में सभी वर्णों का हेक्स/बाइनरी मान देगा और हेक्स में "छिपे हुए" वर्णों की कोई अवधारणा नहीं है:

    DECLARE @PostalCode NVARCHAR(20);
    SET @PostalCode = N'053000'+ NCHAR(0x2008); -- 0x2008 = "Punctuation Space"
    SELECT @PostalCode AS [NVarCharValue],
           CONVERT(VARCHAR(20), @PostalCode) AS [VarCharValue],
           CONVERT(VARCHAR(20), RTRIM(@PostalCode)) AS [RTrimmedVarCharValue],
           CONVERT(VARBINARY(20), @PostalCode) AS [VarBinaryValue];
    

    रिटर्न:

    NVarCharValue   VarCharValue   RTrimmedVarCharValue   VarBinaryValue
    053000          053000?        053000?                0x3000350033003000300030000820
    

    NVARCHAR डेटा को यूटीएफ -16 के रूप में संग्रहीत किया जाता है जो 2-बाइट सेट में काम करता है। छिपे हुए 2-बाइट सेट को देखने के लिए अंतिम 4 हेक्स अंकों को देखते हुए, हम "0820" देखते हैं। चूंकि विंडोज और एसक्यूएल सर्वर यूटीएफ -16 लिटिल एंडियन (यानी यूटीएफ -16 एलई) हैं, बाइट रिवर्स ऑर्डर में हैं। अंतिम 2 बाइट्स फ़्लिप करना -- 08 और 20 -- हमें "2008" मिलता है, जो कि "विराम चिह्न स्थान" है जिसे हमने NCHAR(0x2008) के माध्यम से जोड़ा है ।

    साथ ही, कृपया ध्यान दें कि RTRIM यहाँ बिल्कुल भी मदद नहीं की।

  2. सरल तरीके से, आप केवल प्रश्नवाचक चिह्नों को कुछ भी नहीं से बदल सकते हैं:

    SELECT REPLACE(CONVERT(VARCHAR(20), [PostalCode]), '?', '');
    
  3. इससे भी महत्वपूर्ण बात यह है कि आपको [PostalCode] . को रूपांतरित करना चाहिए VARCHAR . पर फ़ील्ड करें ताकि यह इन पात्रों को संग्रहीत न करे। कोई भी देश ऐसे अक्षरों का उपयोग नहीं करता है जो ASCII वर्ण सेट में प्रदर्शित नहीं होते हैं और जो VARCHAR डेटाटाइप के लिए मान्य नहीं हैं, कम से कम जहाँ तक मैंने कभी पढ़ा है (संदर्भों के लिए नीचे अनुभाग देखें)। वास्तव में, जो अनुमति है वह ASCII का एक छोटा उपसमुच्चय है, जिसका अर्थ है कि आप रास्ते में आसानी से फ़िल्टर कर सकते हैं (या बस वही करें REPLACE जैसा कि डालने या अपडेट करते समय ऊपर दिखाया गया है):

    ALTER TABLE [table] ALTER COLUMN [PostalCode] VARCHAR(20) [NOT]? NULL;
    

    वर्तमान NULL . की जांच करना सुनिश्चित करें / NOT NULL कॉलम के लिए सेटिंग और इसे ऊपर दिए गए ALTER स्टेटमेंट में समान बनाएं, अन्यथा इसे बदला जा सकता है क्योंकि डिफ़ॉल्ट NULL है यदि निर्दिष्ट नहीं है।

  4. यदि आप तालिका के स्कीमा को नहीं बदल सकते हैं और खराब डेटा की आवधिक "सफाई" करने की आवश्यकता है, तो आप निम्न चला सकते हैं:

    ;WITH cte AS
    (
       SELECT *
       FROM   TableName
       WHERE  [PostalCode] <>
                      CONVERT(NVARCHAR(50), CONVERT(VARCHAR(50), [PostalCode]))
    )
    UPDATE cte
    SET    cte.[PostalCode] = REPLACE(CONVERT(VARCHAR(50), [PostalCode]), '?', '');
    

    कृपया ध्यान रखें कि यदि तालिका में लाखों पंक्तियाँ हैं तो उपरोक्त क्वेरी कुशलता से काम करने के लिए नहीं है। उस समय इसे लूप के माध्यम से छोटे सेटों में हैंडल करने की आवश्यकता होगी।

संदर्भ के लिए, यहां डाक कोड के लिए विकिपीडिया लेख है। , जो वर्तमान में बताता है कि केवल वही वर्ण जो कभी उपयोग किए गए हैं:

और क्षेत्र के अधिकतम आकार के संबंध में, यहां विकिपीडिया डाक कोड की सूची है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. टी-एसक्यूएल संग्रहीत प्रक्रिया जो एकाधिक आईडी मान स्वीकार करती है

  2. कैसे निर्धारित करें कि संख्या फ्लोट या पूर्णांक है

  3. SQL एक्सप्रेस त्रुटि से कनेक्ट करने में असमर्थ:26-सर्वर/इंस्टेंस का पता लगाने में त्रुटि निर्दिष्ट)

  4. एकाधिक स्तंभों के साथ SQL सर्वर गतिशील धुरी

  5. क्या मैं SQL सर्वर (C#) में एक पंक्ति को INSERT या अद्यतन करने के लिए स्ट्रीम का उपयोग कर सकता हूं?