Qt/QSqlQuery:绑定BLOB字段时二进制数据被解析为字符串
我正在从文件中读取二进制数据,并尝试将其存储到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
。