2011-12-28 11 views
5

ファイルからバイナリデータを読み込み、MySqlデータベースのLONGBLOBフィールドに格納しようとしています。
私はPythonとPySideを使っています。Qt/QSqlQuery:バイナリデータは、BLOBフィールドにバインドするときに文字列として解釈されます。

私の問題は、バイナリデータが文字列として解釈されるということです。つまり、データに改行があったときにデータが切り捨てられます。

これはPythonまたはPySideの問題です。MySqlプロンプトでデータを手動で追加すると完全に機能するためです。
を編集しました:C++を使用した通常のQtで試したところ、同じ問題が発生しました。以下は 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

データにNULL文字( '\ 0')が見つかった場合、データは実際に切り捨てられます。あなたはこの方法でQByteArrayを作成する必要があり、C++で:

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

私は、Pythonを知らないが、私はあなたがあまりにもQByteArrayを作成する必要があると思います。

+0

ありがとう、今は完璧に動作します。これは論理的なことでもあります。\ 0で解析を停止できない場合、Qtは渡されたデータの長さをどのように知るべきですか? – Chris

関連する問題