Qt/QSqlQuery: Binary data is interpreted as string when binding to BLOB field

Я читаю двоичные данные из файлов и пытаюсь сохранить их в поле 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;
}

Есть ли у кого-нибудь идеи, что я могу делать неправильно?

5
задан Chris 28 December 2011 в 18:20
поделиться