मेरे पास बेस 64 प्रारूप में चित्रों के लिए ब्लॉब फ़ील्ड के साथ फ़ायरबर्ड डेटाबेस है। अगर मैं 32kb से अधिक आकार के साथ एन्कोडेड चित्र अपलोड करने का प्रयास करता हूं तो यह मुझे अपवाद देता है:

org.firebirdsql.jdbc.FBSQLException: GDS अपवाद। ३३५५४४५६९। डायनेमिक SQL त्रुटि SQL त्रुटि कोड = -104 कोड ३३६३९७३३१ के लिए कोई संदेश नहीं मिला।

जिसका अर्थ है कि एक्स बाइट्स के साथ स्ट्रिंग अक्षर वाई बाइट्स की अधिकतम लंबाई से अधिक है। क्या फायरबर्ड का बूँद वास्तव में इतना छोटा है और उदाहरण के लिए मुझे mySQL के लिए अपना DB बदलने की आवश्यकता है? चित्रों के लिए बैक-एंड एपीआई बनाने के लिए मेरे पास न तो समय है और न ही PHP ज्ञान।

1
ezh 14 पद 2020, 18:50

2 जवाब

सबसे बढ़िया उत्तर

फायरबर्ड में बूँदें 32 किलोबाइट से कहीं अधिक बड़ी हो सकती हैं, डेटाबेस के पृष्ठ आकार के आधार पर, एक एकल बूँद का अधिकतम आकार 32GB तक पहुँच सकता है, कुछ ओवरहेड को अनदेखा कर सकता है।

समस्या यह है कि - इसकी आवाज से - आपने पैरामीटर का उपयोग करने के बजाय मानों को क्वेरी स्ट्रिंग में जोड़कर प्रश्नों का निर्माण किया है। क्वेरी स्ट्रिंग में मानों को जोड़ना असुरक्षित है (यह आपको SQL इंजेक्शन के लिए असुरक्षित बनाता है), लेकिन इस मामले में आप एक कठिन सीमा तक पहुँच जाते हैं। फायरबर्ड में, स्ट्रिंग अक्षर 32 किलोबाइट तक सीमित हैं (या - फायरबर्ड 3 - 64 किलोबाइट्स (वास्तव में 64 केबी - 3) के बाद से जब एक ब्लॉब को सौंपा जाता है)।

यदि आप बड़े मान निर्दिष्ट करना चाहते हैं, तो आपको पैरामीटर के साथ तैयार कथन का उपयोग करना होगा। उदाहरण के लिए (नोट: मैं जावा कोड पोस्ट कर रहा हूं, क्योंकि आपने अपने प्रश्न में जो त्रुटि पोस्ट की है वह Jaybird, फायरबर्ड के JDBC ड्राइवर (जावा के लिए) द्वारा निर्मित है):

try (var pstmt = connection.prepareStatement("insert into images (filename, blobdata) values (?, ?)")) {
    pstmt.setString(1, "filename.jpg");
    pstmt.setBinaryStream(2, someInputStreamForTheData);
    // or: pstmt.setBytes(2, fileBytes);
    pstmt.executeUpdate();
}

एक तरफ, बेस 64 एन्कोडेड छवियों को एक ब्लॉब में सहेजना (मानना ​​BLOB SUB_TYPE BINARY, BLOB SUB_TYPE TEXT नहीं) मुझे ज्यादा समझ में नहीं आता है, छवियां बाइनरी डेटा हैं, और ब्लॉब्स का उद्देश्य बाइनरी डेटा को सहेजना है। बेस 64 का उपयोग अनावश्यक भंडारण ओवरहेड (डेटा के प्रत्येक 3 बाइट्स के लिए 1 अतिरिक्त बाइट) का परिचय देता है।

2
Mark Rotteveel 15 पद 2020, 19:45

BLOB में स्ट्रिंग अक्षर न डालें। पैरामीटरयुक्त प्रश्नों का प्रयोग करें और उनके माध्यम से बीएलओबी में डेटा डालें। ऐसे में वे कम से कम 2 गीगाबाइट रख सकते हैं।

https://www.firebirdsql.org/file/documentation/drivers_documentation/java/3.0.0/docs/org/firebirdsql/jdbc/FBBlob.html

कैसे php में ब्लॉब छवि FIrebird जोड़ने के लिए?

पीडीओ सीधे डेटाबेस में छवि डालें - हमेशा बीएलओबी डालें - 0 बी

0
user13964273 15 पद 2020, 15:06