我正在从文件中读取二进制数据,并尝试将其存储在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 = "startn n n end"
query.prepare("INSERT INTO blobtest (data) VALUES(:data)")
query.bindValue(":data", data, QSql.In | QSql.Binary)
query.exec_()
db.close()
###############################################################################
if __name__ == "__main__":
testit()
Edit:这里是它的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("startn n n nend");
query.prepare("INSERT INTO blobtest (data) VALUES(:data)");
query.bindValue(":data", data, QSql::In | QSql::Binary);
query.exec();
db.close();
return 0;
}
有人知道我可能做错了什么吗?
当在数据中发现NULL字符(' ')时,数据实际上被截断。在c++中,你必须这样创建QByteArray
:
QByteArray data = QByteArray("startn n n nend", 15);
我不懂python,但我认为你也必须创建一个QByteArray