हाइबरनेट और पोस्टग्रेएसक्यूएल जेडीबीसी ड्राइवर के स्रोत कोड में बहुत सारी खुदाई के बाद मैं समस्या का मूल कारण ढूंढने में कामयाब रहा। अंत में 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 में परिवर्तित करने में कामयाब रहा।
इस उत्तर में सरल पेस्ट करने के लिए समाधान बहुत बड़े हैं। यदि आप रुचि रखते हैं, तो मुझे एक पंक्ति दें, और मैं इसे आपको भेज दूंगा।
चीयर्स, फ्रैंक