Я читаю двоичные данные из файлов и пытаюсь сохранить их в поле LONGBLOB в базе данных MySql.
Для этого я использую Python и PySide.
Моя проблема в том, что двоичные данные интерпретируются как строка, то есть данные усекаются, когда в них встречается новая строка.
Похоже, что это проблема Python или PySide, потому что если я добавляю данные вручную в подсказке MySql, они работают отлично.
Edit: Я только что попробовал это с обычным 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()
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("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;
}
Есть ли у кого-нибудь идеи, что я могу делать неправильно?