2011-12-28 12 views
5

पर बाध्यकारी होने पर बाइनरी डेटा को स्ट्रिंग के रूप में व्याख्या किया जाता है। मैं फ़ाइलों से बाइनरी डेटा पढ़ रहा हूं और इसे एक MyBQL डेटाबेस में LONGBLOB फ़ील्ड में संग्रहीत करने का प्रयास करता हूं।
मैं इसके लिए पाइथन और पायसाइड का उपयोग कर रहा हूं।क्यूटी/QSqlQuery: बीएलओबी क्षेत्र

मेरी समस्या यह है कि बाइनरी डेटा को एक स्ट्रिंग के रूप में व्याख्या किया जाता है, जिसका अर्थ डेटा में एक नई लाइन होने पर डेटा को छोटा कर दिया जाता है।

यह एक पायथन या पायसाइड समस्या प्रतीत होता है, क्योंकि यदि मैं MySQL प्रॉम्प्ट में मैन्युअल रूप से डेटा जोड़ता हूं तो यह पूरी तरह से काम करता है।
संपादित करें: मैंने इसे सामान्य क्यूटी के साथ सी ++ का उपयोग करके आजमाया और मेरे पास एक ही समस्या है।
CREATE TABLE blobtest (id INT PRIMARY KEY AUTO_INCREMENT, data LONGBLOB NOT NULL;

नीचे एक प्रतिलिपि प्रस्तुत है:

मेरे तालिका परिभाषा इस प्रकार है।

from PySide.QtSql import QSqlDatabase, QSqlQuery, QSql 

def testit(): 
    db = QSqlDatabase.addDatabase("QMYSQL") 
    db.setHostName("localhost") 
    db.setDatabaseName("testdb") 
    db.setUserName("user") 
    db.setPassword("pass") 
    db.open() 

    query = QSqlQuery(db) 
    data = "start\n\0\n\0\n\0end" 
    query.prepare("INSERT INTO blobtest (data) VALUES(:data)") 
    query.bindValue(":data", data, QSql.In | QSql.Binary) 
    query.exec_() 

    db.close() 

############################################################################### 

if __name__ == "__main__": 
    testit() 

संपादित करें: यहाँ अपनी C++ संस्करण में एक ही प्रतिलिपि प्रस्तुत है। मैं डेटा के आयोजन के लिए एक QByteArray उपयोग कर रहा हूँ, लेकिन यह अभी भी

छोटा किया गया है
#include <QtSql/QtSql> 
#include <QtCore/QByteArray> 

int main(int argc, char* argv[]) { 
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); 
    db.setHostName("localhost"); 
    db.setDatabaseName("testdb"); 
    db.setUserName("user"); 
    db.setPassword("pass"); 
    db.open(); 

    QSqlQuery query = QSqlQuery(db); 
    QByteArray data = QByteArray("start\n\0\n\0\n\0\nend"); 
    query.prepare("INSERT INTO blobtest (data) VALUES(:data)"); 
    query.bindValue(":data", data, QSql::In | QSql::Binary); 
    query.exec(); 

    db.close(); 
    return 0; 
} 

किसी को भी एक विचार मैं गलत क्या कर किया जा सकता है है?

उत्तर

6

डेटा में एक पूर्ण वर्ण ('0') पाया जाता है जब डेटा वास्तव में छोटा कर दिया जाता है। C++ में आप इस तरह से QByteArray बनाने के लिए है:

QByteArray data = QByteArray("start\n\0\n\0\n\0\nend", 15); 

मैं अजगर पता नहीं है, लेकिन मुझे लगता है कि आप भी एक QByteArray बनाने होंगे।

+0

बहुत बहुत धन्यवाद, अब पूरी तरह से काम करता है। यह केवल तार्किक है - क्यूटी को पता होना चाहिए कि पास डेटा कितना समय है, अगर इसे \ 0 पर पार्सिंग रोकने की अनुमति नहीं दी जाएगी। – Chris

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