2011-06-06 7 views
6

का एक बहुत मैं एक Oracle 10g डेटाबेस में निम्नलिखित "अनुवाद" तालिका:ओरेकल, UTF-8, NVARCHAR2, और भ्रम

ID VARCHAR2(100 BYTE) 
LANGUAGE CHAR(2 BYTE) 
COUNTRY CHAR(2 BYTE) 
TRANSLATION NVARCHAR2(2000 CHAR) 
TRACK_TIMESTAMP DATE 
TRACK_USER VARCHAR2(2000 BYTE) 

जब मैं यह करने के लिए प्रयास करें:

update translation set translation = 'œ' where id = 'MY_ID' And language = 'fr'; 

तब मैं इस चलाएँ:

select * from translation where id = 'MY_ID' and language = 'fr'; 

और अनुवाद स्तंभ दिखाता है: œ के बजाय S और मैं कोई विचार क्यों नहीं।

विरासत के मुद्दों के कारण मैं पूरे डेटाबेस को यूटीएफ -8 का उपयोग करने के लिए परिवर्तित नहीं कर सकता, क्या कोई अन्य विकल्प हैं?

वर्तमान में राष्ट्रीय चरित्र सेट AL16UTF16 है। सामान्य चरित्र सेट WE8ISO8859P1 है।

मैं वर्तमान में जावा 1.6

ऊपर उपयोग कर रहा हूँ एक सरल उदाहरण है।

UPDATE TRANSLATION SET TRANSLATION=? WHERE TRANSLATION.COUNTRY=? and TRANSLATION.ID=? and TRANSLATION.LANGUAGE=? 1=1,800 - 2,500 œufs par heure 2=CA 3=3_XT_FE_ECS18 4=fr 

समस्या यहाँ बजाय œufs जोड़ने आप हार्ड-कोडेड शाब्दिक बाँध चर के बजाय का उपयोग कर रहे चूंकि यह ¿ufs

+1

डेटाबेस का राष्ट्रीय चरित्र सेट क्या है? क्या आप वाकई अद्यतन स्टेटमेंट जेनरेट कर रहे हैं जो हार्ड-कोडेड स्ट्रिंग अक्षर का उपयोग करते हैं? या आप बाध्य चर का उपयोग कर रहे हैं? यदि आप बाइंड वैरिएबल का उपयोग कर रहे हैं, तो यह एप्लिकेशन केवल VARCHAR2 की बजाय एनवीआरएआरएआर 2 के रूप में पारित होने वाले डेटा के डेटा प्रकार की पहचान करने वाला एप्लिकेशन है? –

+0

AL16UTF16। सामान्य चरित्र सेट WE8ISO8859P1 है। नहीं, मैं अपडेट स्टेटमेंट्स नहीं बना रहा हूं जो हार्ड-कोडेड स्ट्रिंग अक्षर का उपयोग करते हैं। मैंने जितना संभव हो सके उदाहरण को सरल बनाने की कोशिश की। हम वर्तमान में एस 2 जे का उपयोग करते हैं और मैंने स्प्रिंग्स जेडीबीसी टेम्पलेट के साथ भी यह कोशिश की और '¿ufs' प्राप्त किया। मुझे यकीन नहीं है कि क्या s2j इसे nvarchar2 के रूप में पहचान रहा था, लेकिन यह एक स्ट्रिंग से ऑब्जेक्ट में अपना रिटर्न टाइप बदल गया, इसलिए मुझे लगता है कि यह इसे वर्चर 2 के रूप में नहीं मानता है। आपकी मदद के लिए धन्यवाद अगर मुझे कोई अन्य जानकारी याद आ रही है तो मुझे बताएं। – testing123

उत्तर

1

कहते हैं की है, तो आप होना चाहिए: यहाँ क्या क्वेरी मेरे वास्तविक आवेदन में की तरह लग रहा है अपने अद्यतन विवरण में यूनिकोड तारों को पारित करने में सक्षम।

यदि आप डेटाबेस में लिखने के लिए सीधे जेडीबीसी का उपयोग कर रहे थे, तो writing data to a NVARCHAR2 column पर जेडीबीसी डेवलपर गाइड में एक उदाहरण है। यदि आप 1.5 जेवीएम का उपयोग कर रहे हैं, तो प्रत्येक NVARCHAR2 कॉलम के लिए OraclePreparedStatement.setFormOfUse कॉल का उपयोग करना आवश्यक है। 1.6 जेवीएम में, जीवन आसान हो जाता है क्योंकि जेडीबीसी 4.0 ने एनसीएचएआर और एनवीएआरएआरएआर 2 प्रकार जोड़े। यदि आप 1.5 जेवीएम का उपयोग कर रहे हैं, तो जेडीबीसी में ओरेकल एक्सटेंशन का उपयोग करने के लिए स्प्रिंग जैसे ओआरएम ढांचे को एक गैर-मामूली उपक्रम हो सकता है। मैं वसंत के साथ पर्याप्त परिचित नहीं हूं कि यह जानने के लिए कि कौन से कदम जरूरी होंगे।

संभावित रूप से, आप defaultNChar = true निर्दिष्ट करने के लिए कनेक्शन स्ट्रिंग को संशोधित करने में सक्षम हो सकते हैं। इससे ड्राइवर को राष्ट्रीय चरित्र सेट का उपयोग करके सभी वर्ण कॉलम का इलाज करने के लिए मजबूर कर दिया जाएगा। OraclePreparedStatement एक्सटेंशन का उपयोग करने के लिए स्प्रिंग प्राप्त किए बिना आपकी समस्या को हल करने के लिए यह पर्याप्त हो सकता है।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने मूल पोस्ट में अतिरिक्त जानकारी जोड़ा। अपनी पोस्ट पढ़ने के बाद मैं s2j में खोद रहा हूं और मुझे लगता है कि समस्या यह तथ्य है कि मैं ojdbc14.jar का उपयोग कर रहा हूं, मुझे नवीनतम मिलेगा और परिणाम के साथ टिप्पणी होगी। जानकारी के लिए फिर से धन्यवाद! – testing123

+0

ठीक है, अब मैं उलझन में हूं, मैंने ojdbc6.jar पर अपडेट किया है और अभी भी nvarchar2 कॉलम एक प्रकार 1111 लौटा रहा है (अन्य java.sql में।प्रकार) जब मैं मेटाडेटा को देखता हूं, भले ही मुझे लगता है कि इसे 9-9 (एनवीएआरएआरएआर वैरिएबल java.sql.Types क्लास में मिला है) को मैप करना चाहिए। क्या मुझसे कोई चूक हो रही है? – testing123

+0

आप जेवीएम का किस संस्करण का उपयोग कर रहे हैं? मेटाडेटा वापस करने के लिए आप क्या अनुरोध जारी कर रहे हैं? क्या आप ResultSetMetaData कक्षा का उपयोग कर रहे हैं? या कुछ और? –

संबंधित मुद्दे