सामान्य तौर पर आपके सभी बिंदु सही हैं। NLS_NCHAR_CHARACTERSET NVARCHAR2 . के लिए वर्ण सेट को परिभाषित करता है , आदि अल. कॉलम जबकि NLS_CHARACTERSET VARCHAR2 . के लिए प्रयोग किया जाता है ।
ऐसा क्यों संभव है कि आपको US7ASCII . के साथ चीनी अक्षर दिखाई दें ?
इसका कारण है, आपका डेटाबेस कैरेक्टर सेट और आपका क्लाइंट कैरेक्टर सेट (यानी NLS_LANG देखें) value) दोनों US7ASCII . हैं . आपका डेटाबेस US7ASCII . का उपयोग करता है और यह "सोचता है" भी क्लाइंट US7ASCII . का उपयोग करके डेटा भेजता है . इस प्रकार यह स्ट्रिंग्स का कोई रूपांतरण नहीं करता है, डेटा क्लाइंट से सर्वर में बिट-बाय-बिट स्थानांतरित किया जाता है और इसके विपरीत।
इस तथ्य के कारण आप उन पात्रों का उपयोग कर सकते हैं जो वास्तव में US7ASCII . द्वारा समर्थित नहीं हैं . सावधान रहें, यदि आपका क्लाइंट किसी भिन्न वर्ण सेट का उपयोग करता है (उदाहरण के लिए जब आप किसी Windows अनुप्रयोग में ODP.NET प्रबंधित ड्राइवर का उपयोग करते हैं) तो डेटा बकवास होगा! इसके अलावा यदि आप डेटाबेस कैरेक्टर सेट माइग्रेशन पर विचार करेंगे तो आपके पास भी यही समस्या है।
एक और नोट:मुझे नहीं लगता कि आपको अन्य चरित्र सेटों के साथ वही व्यवहार मिलेगा, उदा। यदि आपका डेटाबेस और आपका क्लाइंट दोनों WE8ISO8859P1 . का उपयोग करेंगे उदाहरण के लिए। यह भी ध्यान रखें कि आपके पास वास्तव में गलत कॉन्फ़िगरेशन है। आपका डेटाबेस वर्ण सेट का उपयोग करता है US7ASCII , आपका NLS_LANG मान भी US7ASCII है (सबसे अधिक संभावना है कि यह बिल्कुल भी सेट नहीं है और Oracle इसे US7ASCII . पर डिफॉल्ट करता है ) लेकिन एसक्यूएल * प्लस का वास्तविक चरित्र सेट, सम्मान। आपका cmd.exe टर्मिनल सबसे अधिक संभावना CP950 या CP936 है।
यदि आप सब कुछ ठीक से सेट करना चाहते हैं तो आप या तो अपना पर्यावरण चर सेट कर सकते हैं NLS_LANG=.ZHT16MSWIN950 (ऐसा लगता है कि CP936 Oracle द्वारा समर्थित नहीं है) या sqlplus.exe चलाने से पहले अपना कोडपेज बदलें कमांड के साथ chcp 437 . इस उचित सेटिंग्स के साथ आप किसी भी चीनी वर्ण को नहीं देखेंगे जैसा आपने शायद उम्मीद की होगी।