Qt / QSqlQuery: двоичные данные интерпретируются как строка при привязке к полю BLOB - PullRequest
5 голосов
/ 28 декабря 2011

Я читаю двоичные данные из файлов и пытаюсь сохранить их в поле LONGBLOB в базе данных MySql.
Для этого я использую 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()

Редактировать: здесь тот же воспроизводитель в его варианте 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 голосов
/ 29 декабря 2011

Данные действительно усекаются, когда в данных обнаруживается символ NULL ('\ 0').В C ++ вы должны создать QByteArray следующим образом:

QByteArray data = QByteArray("start\n\0\n\0\n\0\nend", 15);

Я не знаю Python, но я думаю, что вам нужно создать QByteArray.

...