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

हाइबरनेट/पोस्टग्रेएसक्यूएल के साथ एलओबी स्ट्रिंग संपत्ति में यूरो-साइन स्टोर नहीं कर सकता है

हाइबरनेट और पोस्टग्रेएसक्यूएल जेडीबीसी ड्राइवर के स्रोत कोड में बहुत सारी खुदाई के बाद मैं समस्या का मूल कारण ढूंढने में कामयाब रहा। अंत में Clob की सामग्री को डेटाबेस में लिखने के लिए BlobOutputStream (JDBC ड्राइवर द्वारा प्रदान की गई) की राइट () विधि को लागू किया जाता है। यह तरीका इस तरह दिखता है:

public void write(int b) throws java.io.IOException
{
    checkClosed();
    try
    {
        if (bpos >= bsize)
        {
            lo.write(buf);
            bpos = 0;
        }
        buf[bpos++] = (byte)b;
    }
    catch (SQLException se)
    {
        throw new IOException(se.toString());
    }
}

यह विधि एक 'int' (32 बिट्स/4 बाइट्स) को तर्क के रूप में लेती है और इसे 'बाइट' (8 बिट्स/1 बाइट) में परिवर्तित करती है जो प्रभावी रूप से 3 बाइट्स की जानकारी खो देती है। जावा के भीतर स्ट्रिंग अभ्यावेदन UTF-16 एन्कोडेड हैं, जिसका अर्थ है कि प्रत्येक वर्ण 16 बिट्स / 2 बाइट्स द्वारा दर्शाया गया है। यूरो-चिह्न का इंट मान 8364 है। बाइट में रूपांतरण के बाद, मान 172 बना रहता है (ऑक्टेट प्रतिनिधित्व 254 में)।

मुझे यकीन नहीं है कि अब इस समस्या का सबसे अच्छा समाधान क्या है। आईएमएचओ जेडीबीसी ड्राइवर को जावा यूटीएफ -16 वर्णों को एन्कोडिंग/डिकोड करने के लिए ज़िम्मेदार होना चाहिए जो डेटाबेस को एन्कोडिंग की आवश्यकता हो। हालाँकि, मुझे JDBC ड्राइवर कोड में उसके व्यवहार को बदलने के लिए कोई भी बदलाव की संभावना नहीं दिख रही है (और मैं अपना JDBC ड्राइवर कोड लिखना और बनाए रखना नहीं चाहता)।

इसलिए, मैंने कस्टम क्लॉब टाइप के साथ हाइबरनेट को बढ़ाया और क्लॉब को पुनर्प्राप्त करते समय डेटाबेस में लिखने से पहले यूटीएफ -16 वर्णों को यूटीएफ -8 में परिवर्तित करने में कामयाब रहा।

इस उत्तर में सरल पेस्ट करने के लिए समाधान बहुत बड़े हैं। यदि आप रुचि रखते हैं, तो मुझे एक पंक्ति दें, और मैं इसे आपको भेज दूंगा।

चीयर्स, फ्रैंक




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. तारीख से मिलीसेकंड / मिलीसेकंड से आज तक

  2. SchemaSpy PostgreSQL - WARN - कनेक्शन विफलता

  3. क्या मैं पहले से किए गए लेन-देन को रोलबैक कर सकता हूं? (डेटा हानि)

  4. PostgreSQL:डेटाबेस डंप से पुनर्स्थापित करें - सिंटैक्स त्रुटि

  5. Psycopg2 db कनेक्शन खोए हुए नेटवर्क कनेक्शन पर हैंग हो जाता है