Qt/QSqlQuery:绑定到BLOB字段时,二进制数据被解释为字符串

Chr*_*ris 5 python mysql qt blob pyside

我正在从文件中读取二进制数据并尝试将其存储在MySql数据库的LONGBLOB字段中.
我正在使用Python和PySide.

我的问题是,二进制数据被解释为字符串,这意味着当数据中出现换行符时数据被截断.

这似乎是一个Python或PySide问题,因为如果我在MySql提示中手动添加数据,它可以很好地工作.
编辑:我只是用普通的Qt用C++尝试过,我在那里遇到了同样的问题.

我的表定义如下:
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()
Run Code Online (Sandbox Code Playgroud)

编辑:这里是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;
}
Run Code Online (Sandbox Code Playgroud)

有谁知道我可能做错了什么?

Lui*_* R. 6

当在数据中找到NULL字符('\ 0')时,数据实际上被截断.在C++中,您必须以QByteArray这种方式创建:

QByteArray data = QByteArray("start\n\0\n\0\n\0\nend", 15);
Run Code Online (Sandbox Code Playgroud)

我不知道python,但我认为你必须创建一个QByteArray.