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)
有谁知道我可能做错了什么?
当在数据中找到NULL字符('\ 0')时,数据实际上被截断.在C++中,您必须以QByteArray这种方式创建:
QByteArray data = QByteArray("start\n\0\n\0\n\0\nend", 15);
Run Code Online (Sandbox Code Playgroud)
我不知道python,但我认为你必须创建一个QByteArray.