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

SQL सर्वर रिटर्न ??? जब स्तंभ थाई वर्णों के साथ अद्यतन किया जाता है

प्रश्न में बहुत अधिक जानकारी प्रदान नहीं की गई है। हम केवल इतना जानते हैं:

  • कॉलम Thai_CI_AS के संयोजन का उपयोग कर रहा है (कम से कम ऐसा लगता है कि सवाल बता रहा है)
  • थाई वर्ण पारित किए जा रहे हैं
  • कॉलम में जो स्टोर किया जाता है वह है:???

हालाँकि, केवल उसी से हम दो बातें निकाल सकते हैं:

  1. आने वाली स्ट्रिंग न तो NVARCHAR है पैरामीटर / चर, न ही यह एक स्ट्रिंग अक्षर है जो एक अपर-केस "N" के साथ उपसर्ग करता है,

    और

  2. डीबी के लिए डिफ़ॉल्ट संयोजन जिसमें क्वेरी निष्पादित की जा रही है (जरूरी नहीं कि डीबी जिसमें तालिका मौजूद हो) नहीं है एक थाई संयोजन।

हमें नहीं पता कि गंतव्य कॉलम VARCHAR है या नहीं या NVARCHAR , लेकिन इससे कोई फर्क नहीं पड़ता कि कॉलम का कोलाज थाई कोलेशन है (क्योंकि यह VARCHAR को अनुमति देगा। थाई वर्ण रखने के लिए डेटा, और NVARCHAR परवाह किए बिना काम करेगा)।

अगर या तो :

  • आने वाली स्ट्रिंग NVARCHAR . का उपयोग करती है पैरामीटर (या यदि स्ट्रिंग शाब्दिक है, तो एक अपर-केस "N" के साथ उपसर्ग करें),

    या

  • क्वेरी को डीबी में निष्पादित किया गया था जिसमें थाई डिफ़ॉल्ट कोलेशन है

तब थाई वर्ण अपेक्षित रूप से संग्रहीत हो जाएंगे।

निम्न उदाहरण इस व्यवहार को प्रदर्शित करता है। मैं एक थाई कैरेक्टर Khomut U+0E5B का उपयोग करता हूं एक उदाहरण पर Korean_100_CS_AS_KS_WS_SC इंस्टेंस-लेवल डिफ़ॉल्ट Collation. गंतव्य कॉलम में Thai_CI_AS . का एक संयोजन है . पहला, जबकि "वर्तमान" DB वह है जो नहीं . करता है एक थाई डिफ़ॉल्ट Collation है, मैं चरित्र को दो बार जोड़ता हूं:एक बार "N" के साथ उपसर्ग और एक बार स्ट्रिंग शाब्दिक पर कोई उपसर्ग नहीं:

USE [tempdb];
-- DROP TABLE #Thai;
CREATE TABLE #Thai (ID INT IDENTITY(1, 1), Col1 VARCHAR(50) COLLATE Thai_CI_AS);

-- In a DB with a non-Thai default Collation:
INSERT INTO #Thai (Col1) VALUES ('๛');
INSERT INTO #Thai (Col1) VALUES (N'๛');

इसके बाद, मैं एक ऐसे डीबी पर स्विच करता हूं जो करता है एक थाई डिफ़ॉल्ट Collation है और केवल गैर-प्रीफिक्स्ड स्ट्रिंग डालें ("एन" -प्रीफिक्स्ड स्ट्रिंग को फिर से परीक्षण करने की कोई वास्तविक आवश्यकता नहीं है):

USE [other_db];

-- In a DB with a Thai default Collation:
INSERT INTO #Thai (Col1) VALUES ('๛');


SELECT * FROM #Thai;

नतीजा यह है:

ID  Col1
1   ?
2   ๛
3   ๛

जैसा कि आप देख सकते हैं (उपरोक्त परिणामों में बिंदु # नीचे आईडी # से संबंधित है):

  1. गैर-"N"-प्रीफिक्स्ड स्ट्रिंग, जिसका उपयोग DB में गैर-थाई डिफ़ॉल्ट Collation का उपयोग करके किया जाता है, का अनुवाद ? में किया गया है
  2. एक गैर-थाई डिफ़ॉल्ट Collation का उपयोग करके DB में "N" -prefixed string का भी उपयोग किया जाता है, मान को सही ढंग से संग्रहीत किया जाता है
  3. गैर-"N"-प्रीफिक्स्ड स्ट्रिंग, जिसका उपयोग DB में किया जाता है, जिसमें थाई डिफ़ॉल्ट Collation होता है, मान को सही ढंग से संग्रहीत करता है



  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 सर्वर 2008 डेटा कैप्चर बदलें, परिवर्तन किसने किया?

  2. तालिका संरचना में हेरफेर

  3. क्या कोई विदेशी कुंजी NULL और/या डुप्लिकेट हो सकती है?

  4. SQL सर्वर में महीने के नाम को महीने की संख्या में बदलें

  5. फिक्स:"बैकअप लॉग नहीं किया जा सकता क्योंकि कोई मौजूदा डेटाबेस बैकअप नहीं है।" एसक्यूएल सर्वर/एसक्यूएल एज में