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

5 投票
1 回答
2705 浏览
提问于 2025-04-17 09:09

我正在从文件中读取二进制数据,并尝试将其存储到MySql数据库中的LONGBLOB字段里。
我使用的是Python和PySide来实现这个功能。

我遇到的问题是,二进制数据被当作字符串来处理,这意味着当数据中出现换行符时,数据会被截断。

这似乎是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;
}

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

1 个回答

6

当数据中出现一个空字符('\0')时,数据就会被截断。在C++中,你需要这样创建一个 QByteArray

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

我不太懂Python,但我觉得你在Python中也需要创建一个 QByteArray

撰写回答