के साथ LOB स्ट्रिंग प्रॉपर्टी में यूरो-साइन स्टोर नहीं कर सकता है मुझे पोस्टग्रेएसक्यूएल 8.4 में लोब स्ट्रिंग गुणों में यूरो-साइन (€) जैसे विशेष वर्णों को लिखने और हाइबरनेट 3.6.10 के साथ पढ़ने में परेशानी हो रही है।हाइबरनेट/पोस्टग्रेएसक्यूएल
मुझे क्या पता है कि PostgreSQL तालिका के कॉलम में बड़ी वर्ण वस्तुओं को स्टोर करने के दो अलग-अलग तरीकों को प्रदान करता है। उन्हें सीधे उस तालिका कॉलम में या अप्रत्यक्ष रूप से एक अलग तालिका में संग्रहीत किया जा सकता है (इसे वास्तव में pg_largeobject कहा जाता है)। बाद के मामले में, स्तंभ में pg_largeobject में पंक्ति में संदर्भ (ओआईडी) होता है।
हाइबरनेट 3.6.10 में डिफ़ॉल्ट व्यवहार अप्रत्यक्ष ओआईडी दृष्टिकोण है। हालांकि, एक अतिरिक्त एनोटेशन @ org.hibernate.annotations जोड़ना संभव है। टाइप स्टोरेज व्यवहार प्राप्त करने के लिए लॉब प्रॉपर्टी में टाइप करें (टाइप = "org.hibernate.type.TextType")।
दोनों दृष्टिकोण ठीक काम करते हैं, इस पल को छोड़कर कि मैं यूरो चिह्न (€) जैसे विशेष पात्रों के साथ काम करना चाहता हूं। उस स्थिति में प्रत्यक्ष भंडारण तंत्र काम करता रहता है, लेकिन अप्रत्यक्ष भंडारण तंत्र टूट जाता है।
मैं एक उदाहरण के साथ प्रदर्शित करना चाहता हूं। मैंने 2 @ लॉब गुणों के साथ एक परीक्षण इकाई बनाई है। एक प्रत्यक्ष भंडारण सिद्धांत इस प्रकार है, अन्य अप्रत्यक्ष भंडारण:
@Basic
@Lob
@Column(name = "CLOB_VALUE_INDIRECT_STORAGE", length = 2147483647)
public String getClobValueIndirectStorage()
और
@Basic
@Lob
@org.hibernate.annotations.Type(type="org.hibernate.type.TextType")
@Column(name = "CLOB_VALUE_DIRECT_STORAGE", length = 2147483647)
public String getClobValueDirectStorage()
अगर मैं एक इकाई बनाने के लिए, यूरो चिह्न के साथ दोनों के गुण को पॉप्युलेट और फिर डेटाबेस मैं देख रहा हूँ की ओर जारी रहती है निम्नलिखित मैं
id | clob_value_direct_storage | clob_value_indirect_storage
----+---------------------------+----------------------------
6 | € | 910579
देख मैं तो मेज pg_largeobject मैं देख रहा हूँ क्वेरी तो जब मैं एक का चयन करें:
loid | pageno | data
--------+--------+------
910579 | 0 | \254
pg_largeobject का 'डेटा' कॉलम बाइटा प्रकार का है, जिसका अर्थ है कि जानकारी कच्चे बाइट्स के रूप में संग्रहीत की जाती है। अभिव्यक्ति '\ 254' एक एकल बाइट का प्रतिनिधित्व करती है और यूटीएफ -8 में चरित्र '¬' का प्रतिनिधित्व करता है। यह वही मान है जो मैं वापस प्राप्त करता हूं जब मैं डेटाबेस से इकाई को वापस लोड करता हूं।
में यूरो चिह्न UTF-8 3 बाइट्स के होते हैं, तो मैं 'डेटा' स्तंभ की उम्मीद है 3 बाइट्स है और 1.
यह केवल, यूरो हस्ताक्षर के लिए नहीं होती है के लिए नहीं बल्कि करने के लिए होगा कई विशेष पात्र। क्या यह हाइबरनेट में एक समस्या है? या जेडीबीसी चालक? क्या कोई तरीका है कि मैं इस व्यवहार को बदल सकता हूं?
अग्रिम धन्यवाद,
सधन्यवाद,
फ़्रैंक डी Bruijn
क्यों आप पहली जगह में बड़े वस्तुओं का उपयोग कर रहे हैं? बस उस कॉलम के लिए डेटाटाइप 'टेक्स्ट' का उपयोग करें। यदि आप स्टोर करना चाहते हैं तो 'बाइटा' या बड़ी वस्तुओं के साथ गड़बड़ करने की कोई आवश्यकता नहीं है। –
ऐसा करने के कई कारण हो सकते हैं। मुझे नहीं पता। मैं अन्य उपयोगकर्ताओं के उपयोग के लिए एक ढांचा प्रदान करता हूं और मैं दोनों विकल्पों का समर्थन करना चाहता हूं। जेडीबीसी चालक के पुराने संस्करणों में (या हाइबरनेट, मुझे यकीन नहीं है) डिफ़ॉल्ट व्यवहार 'प्रत्यक्ष भंडारण' था। बाद में यह 'अप्रत्यक्ष भंडारण' में बदल गया। शायद कुछ अच्छे कारण के लिए। –
मैंने इसके बारे में कुछ और सोचा और मैं वास्तव में a_horse_with_no_name के साथ अधिक से अधिक सहमत होना शुरू कर देता हूं। सबसे पहले अप्रत्यक्ष भंडारण तंत्र आपको इस कॉलम को एचक्यूएल क्वेरी में उपयोग करने से रोकता है, जो एक बड़ा नुकसान है। अप्रत्यक्ष भंडारण तंत्र स्ट्रीमिंग विकल्प की सुविधा प्रदान करता है, ताकि आप सीधे डेटाबेस से क्लाइंट (स्मृति उपयोग पर बचत) से सामग्री स्ट्रीम कर सकें। निश्चित रूप से यह बीएलओबी के लिए एक वैध तर्क है, लेकिन सीएलओबी के लिए? ज्यादातर परिदृश्यों में वास्तविक सीएलओबी का आकार उस बड़े, निश्चित रूप से 1 एम या उससे अधिक की सीमा में नहीं होगा। इसे स्मृति में संभाला जा सकता है। –