2011-06-28 22 views
6

ऑरैकल डेटाबेस में स्ट्रिंग डालने पर, कुछ राष्ट्रीय पात्रों को प्रश्न चिह्नों के साथ प्रतिस्थापित किया जाता है, भले ही वे एनसीएचएआर या एनवीएआरएआरएआर कॉलम में डाले गए हों - जो सक्षम होना चाहिए सभी यूनिकोड वर्णों को संभालने के लिए।राष्ट्रीय वर्णों को एक ऑरैकल में डालने वाला एनसीएचएआर या एनवीएआरएआरएआर कॉलम काम नहीं करता

यह ओरेकल के एसक्यूएल डेवलपर, एसक्लप्लस या जेडीबीसी ड्राइवर का उपयोग करके होता है।

डेटाबेस NLS_CHARACTERSET WE8ISO8859P1 (पश्चिमी यूरोपीय ISO-8859-1) NCHAR कॉलम के लिए इस्तेमाल किया NLS_NCHAR_CHARACTERSET पर सेट है AL16UTF16 को तैयार है। (यूटीएफ -16)

एनएलएस_CHARACTERSET में कोई भी चरित्र एक उल्टा प्रश्न चिह्न के साथ प्रतिस्थापित नहीं किया जाता है।

+0

मैं स्वयं इस का जवाब दे रहा हूँ के बाद से मैं एक सप्ताह यह पता लगाना खर्च किया है ... मुझे आशा है कि गूगल यह पाता है ... – KarlP

+0

ध्यान दें कि अच्छा तरीका ओरेकल पर यूटीएफ 8 का समर्थन करने के लिए, डेटाबेस वर्ण सेट AL32UTF8 का उपयोग कर डेटाबेस बनाना है, और सामान्य वर्चर 2 कॉलम का उपयोग करना है। – KarlP

उत्तर

19

संपादित करें: ध्यान दें कि ओरेकल पर यूटीएफ को संभालने का सबसे अच्छा तरीका डेटाबेस चरित्र सेट AL32UTF8 का उपयोग कर डेटाबेस बनाना है, और सामान्य वर्चर 2 कॉलम का उपयोग करना है। Nchar कॉलम का उपयोग करने वाली समस्याओं में से एक यह है कि ऑर्केकल सामान्य char/varchar2 कॉलम के लिए इंडेक्स का उपयोग नहीं कर सकता है जब तर्क डिफ़ॉल्ट रूप से nchar के रूप में भेजे जाते हैं।

वैसे भी:


पहले, यूनिकोड शाब्दिक एक 'एन' उपसर्ग के साथ होने के लिए, की जरूरत है इस तरह:: यदि आप डेटाबेस परिवर्तित नहीं कर सकते हैं

select n'Language - Språk - Język' from dual; 

*) 8 बिट एनकोडिंग इस पाठ

दुर्भाग्य से संभाल सकते हैं, वह पर्याप्त नहीं है।

किसी कारण से, डेटाबेस क्लाइंट के लिए डिफ़ॉल्ट व्यवहार डेटाबेस स्ट्रिंग अक्षर, पर सभी स्ट्रिंग अक्षर का अनुवाद करना है जिसका अर्थ है कि डेटाबेस स्ट्रिंग को देखने से पहले भी बदल जाएगा।

ग्राहकों के लिए कुछ विन्यास की जरूरत है एक NCHAR या NVARCHAR स्तंभ में यूनिकोड वर्ण सम्मिलित करने के लिए सक्षम होने के लिए:

एसक्यूएल यूनिक्स पर प्लस

ये environemnet चर यूनिक्स पर्यावरण और sqlplus सेट यूटीएफ -8 फाइलों का उपयोग करने के लिए, और यूनिकोड में स्ट्रिंग अक्षर भेजने के लिए एसक्लप्लस को कॉन्फ़िगर करें।

NLS_LANG=AMERICAN_AMERICA.AL32UTF8 
LC_CTYPE="en_US.UTF-8" 
ORA_NCHAR_LITERAL_REPLACE=true 

(en_US.UTF-8 सोलारिस के लिए है -। लिनक्स या अन्य प्रणालियों विभिन्न तार आवश्यकता हो सकती है, locale -a का उपयोग समर्थित स्थानिक सूची)

JDBC ड्राइवर

दैवज्ञ JDBC का उपयोग कर आवेदन ड्राइवर को यूनिकोड में स्ट्रिंग्स अक्षर भेजने के लिए परिभाषित निम्न सिस्टम प्रॉपर्टी की आवश्यकता होती है।

-Doracle.jdbc.defaultNChar=true 
-Doracle.jdbc.convertNcharLiterals=true 

SQL डेवलपर

sqldeveloper का पता लगाएँ।conf, और जोड़ने के निम्नलिखित लाइनों:

AddVMOption -Doracle.jdbc.defaultNChar=true 
AddVMOption -Doracle.jdbc.convertNcharLiterals=true 

एसक्यूएल प्लस माइक्रोसॉफ्ट विंडोज

मैंने कोशिश नहीं करता है, तो sqlplus माइक्रोसॉफ्ट विंडोज या टॉड पर utf-8 संभालती है सब पर है। Sqlplusw.exe ऐसा कर सकता है, और निम्न रजिस्ट्री सेटिंग्स चाल कर सकती हैं।

NLS_LANG=AMERICAN_AMERICA.AL32UTF8 
ORA_NCHAR_LITERAL_REPLACE=true 
+0

क्या आप माइक्रोसॉफ्ट एसक्यूएल एक्सप्रेस 2005 के लिए इसे कैसे करना चाहते हैं? – CyprUS

+0

आम तौर पर नहीं। जावा के संबंध में, जेडीबीसी ड्राइवर और विजुअल स्टूडियो बॉक्स से बाहर काम कर रहा है, अगर कॉलम प्रकार नचर है और अक्षरों को एन के साथ प्रीफिक्स्ड किया गया है। – KarlP

+0

क्या आप जानते हैं कि इसे .NET System.Data.OracleClient ड्राइवरों के लिए कैसे सेट करें? –

0

धन्यवाद कार्लप - जो मुझे जाने लगा। मेरे लिए क्या काम किया रिकॉर्डिंग।

लिनक्स पर sqlplus का उपयोग करते हुए, एक गैर-यूनिकोड डेटाबेस (उदाहरण: आईएसओ 885 9 आदि) के एक nvarchar कॉलम में चीनी (कोई utf8) पाठ डालने।

मेरे सिस्टम पर ये डीबी पैरा, चार के लिए एक बाइट एन्कोडिंग नोट करें, लेकिन नाचारे के लिए मल्टीबाइट। NLS_CHARACTERSET WE8ISO8859P1
NLS_NCHAR_CHARACTERSET AL16UTF16

जैसे:

INSERT INTO tt values (N'气前照灯'); 

'एन' स्ट्रिंग prepending महत्वपूर्ण है। इसके अलावा, sqlplus शुरू करने से पहले env सेट करना होगा

# Important to tell sqldeveloper what encoding is needed. 
export NLS_LANG=AMERICAN_AMERICA.UTF8 
# Others might find AMERICAN_AMERICA.AL32UTF8 or whatever better suits. 

# ** THIS MATTERS - DOES NOT WORK WITHOUT !! 
export ORA_NCHAR_LITERAL_REPLACE=true 
+0

यह नहीं है कि एक उत्तर कैसे माना जाता है। एक जवाब ओपी को सिर्फ अपने मुद्दे के लिए एक समाधान दिखाने के लिए माना जाता है, लेकिन यह पहले से ही एक अच्छी तरह से उपयुक्त समाधान मौजूद है। आपका जवाब अनावश्यक है और यहां से संबंधित नहीं है। मुझे पता है कि आप ढेर ओवरफ्लो के लिए नए हैं, लेकिन ऐसा नहीं है कि यहां एक उत्तर सामान्य रूप से कैसे स्वीकार किया जाता है। क्षमा करें, लेकिन मुझे उम्मीद है कि आप मुझे समझेंगे, कृपया अपना उत्तर हटाने पर विचार करें। :-) –