2011-12-28 15 views
5

Estoy leyendo datos binarios de archivos y trato de almacenarlos en un campo LONGBLOB en una base de datos MySql.
Estoy usando Python y PySide para esto.Qt/QSqlQuery: los datos binarios se interpretan como una cadena cuando se vinculan al campo BLOB

Mi problema es que los datos binarios se interpretan como una cadena, lo que significa que los datos se truncan cuando se produce una nueva línea en los datos.

Esto parece ser un problema de Python o PySide, porque si agrego datos manualmente en el indicador MySql, funciona perfectamente.
Editar: Lo probé con Qt normal usando C++ y tengo el mismo problema allí.

Mi definición de la tabla es la siguiente:
CREATE TABLE blobtest (id INT PRIMARY KEY AUTO_INCREMENT, data LONGBLOB NOT NULL;

A continuación se muestra un reproductor.

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() 

Editar: aquí es el mismo reproductor en su C++ variante. Estoy usando un QByteArray para la celebración de los datos, pero todavía se trunca

#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; 
} 

¿Alguien tiene una idea de lo que podría estar haciendo mal?

Respuesta

6

Los datos se truncan cuando se encuentra un carácter NULL ('\ 0') en los datos. En C++ se tiene que crear el QByteArray de esta manera:

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

No sé pitón pero creo que usted tiene que crear un QByteArray también.

+0

Muchas gracias, funciona perfectamente ahora. Esto también es lógico: ¿de qué otra forma debería saber Qt cuánto tiempo pasan los datos pasados ​​si no se permite detener el análisis en \ 0? – Chris

Cuestiones relacionadas