2012-04-13 8 views
5

मैं तैयार बयान का उपयोग किए बिना कुछ बाइनरी डेटा को MySQL डेटाबेस में डालने का प्रयास कर रहा हूं। इसका कारण यह है कि मैं एक बार में एक ही डालने में हजारों कथनों को एक साथ जोड़ता हूं। (वास्तव में कैसे MySQL डंप & आयात काम करता है)MySQL (बिना तैयार किए गए स्टेटमेंट के) में बाइनरी डेटा डालना

मैं निम्नलिखित बयानों की कोशिश की है, लेकिन सभी असफल रहे हैं:

My_table मानों में सम्मिलित करें (1, 'जी = एफ |} एक्स ', 2);

my_table VALUES (1, CAST ('g = F | } X ' AS BINARY) में INSERT INSERT), 2);

my_table मूल्यों में प्रवेश करें (1, कनवर्टर ('जी = एफ | } एक्स ', बिनरी), 2);

My_table मानों में सम्मिलित करें (1, बाइनरी 'जी = एफ |} एक्स', 2)

त्रुटि मैं मिलता है:

com.mysql.jdbc.MysqlDataTruncation: डेटा काट-छांट: डेटा बहुत लंबा स्तंभ 'binary_data' पंक्ति 1

पर के लिए कोड मैं बयान निष्पादित करने के लिए उपयोग करने के लिए बस है:

conn.createStatement()। ExecuteUpdate (sql);

PreparedStatements अच्छा काम (लेकिन इस मामले में बहुत धीमी गति से कर रहे हैं)

डेटाबेस में वास्तविक स्ट्रिंग मैं एक छोटे से differet प्रदर्शित करता है:

जी = ÷ की | ¸} एक्स £ ì [

बाइनरी देखें: 67 3 डी 81 F7 19 f3 46 7c B8 7 दिन 58 8C 10 a3 ec 5 ब

जावा बाइट्स: 103, 61, -127, -9, 25, -13, 70, 124, -72, 125, 88, -116, 16, -93, -20, 91

क्या यह एन्कोडिंग के साथ कुछ करने के लिए हो सकता है?

किसी भी संकेत बहुत apprecaited, रो

+3

बाइनरी डेटा डाला जा सकता है:

आप सीधे बाइट्स हेक्स में बदल जाती है और उदाहरण के लिए द्वारा 0x

preceeded लिख कर बाइनरी डेटा सम्मिलित कर सकते हैं सरल 'स्टेटमेंट' का उपयोग कर संभव है। –

+2

आप जानते हैं कि आपने "अनुकूलन" संभवतः बेकार है? तैयार बयानों का मुद्दा यह है कि वे MySQL द्वारा "precompiled" हैं और आप केवल MySQL पैरामीटर फ़ीड करते हैं। चाहे आप बयानों को जोड़ते हों या नहीं, आप वैसे भी हजारों मूल्य भेज रहे हैं। और स्वाभाविक रूप से, यह एक समस्या साबित हुई क्योंकि आप आसानी से बाइनरी डेटा नहीं डाल सकते हैं। –

+0

आप अपने 'INSERT' कथन कैसे बना रहे हैं? एन्कोडिंग की संभावना महत्वपूर्ण है, लेकिन आपको सही भागने के बारे में भी चिंता करने की ज़रूरत है (उदाहरण के लिए यदि बाइनरी डेटा में '' 'है। इसके अलावा आप अपने जेडीबीसी [कनेक्शन पैरामीटर] (http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html) की जांच करते हैं, जैसे कि 'useUnicode' और' characterEncoding '? बैच मोड के लिए –

उत्तर

11

मिले समाधान हालांकि कुछ नहीं मैं कहीं भी दस्तावेज को देखा ....:

PreparedStatement pStmt = ...; 
    while(...) { // use for or whatever loop 
     pStmt.clearParameters(); 
     pStmt.setBinaryStream(2, ...); 
     pStmt.addBatch(); 
    } 
    pStmt.executeBatch(); 

अधिक विस्तृत जानकारी के कैसे आप बैचों JDBC और MySQL के साथ प्रभावी बना सकती है पर यहाँ एक नजर है ।केवल `PreparedStatement` या` CallableStatement` और नहीं के माध्यम से

INSERT INTO my_table VALUES (1,0x19c0300dc90e7cedf64703ed8ae8683b,2); 
+1

मुझे एहसास नहीं हुआ कि MySQL स्वचालित रूप से हेक्स को डीकोड करता है, इस सहायक पोस्ट के लिए धन्यवाद। – fabspro

+1

नोटेशन x'19c0300dc90e7cedf64703ed8ae8683b 'काम भी करता है। यह सब MySQL संदर्भ मैनुअल के §9.1.4 में प्रलेखित है। – olefevre

2

एक तैयार बयान निस्संदेह सबसे तेजी से दृष्टिकोण है। कारण यह है कि आपको यह बहुत धीमा लगता है क्योंकि आप इसे लेनदेन के अंदर उपयोग नहीं कर रहे हैं। आप आधार 64 के साथ कुछ प्यारा करने में सक्षम हो सकते हैं, लेकिन यह बहुत धीमा होगा।

3

क्या आपने बैच मोड में प्रीपेयरस्टेटमेंट का उपयोग करने का प्रयास किया है? .... MySQL and JDBC with rewriteBatchedStatements=true

+0

+1। –

+0

हाँ - एक समय में 2000 स्टेटमेंट्स पहले से ही बैचिंग कर रहा है। मानक mysql आयात (अतिरिक्त कस्टम सुविधाओं के साथ) से कुछ तेज लिखने की कोशिश कर रहे हैं वर्तमान प्रदर्शन मानक आयात से 40% धीमा है, भले ही मैं समांतर में प्रसंस्करण कर रहा हूं - बाइनरी कॉलम वाली तालिकाएं (जिसे मैं प्रसंस्करण कर रहा हूं तैयार किए गए स्तर सबसे धीमे हैं) –

+0

@ आरओ। तो, तो तैयार की गई स्थिरता स्थिरता से धीमी नहीं है। यदि ऐसा है, तो आपको एक प्रश्न पूछना चाहिए कि यह क्यों है, क्योंकि यह नहीं होना चाहिए। –

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