Russian Qt Forum

Qt => Базы данных => Тема начата: sergek от Июнь 10, 2014, 20:49



Название: Запись двоичных даннных в SQLITE 3
Отправлено: sergek от Июнь 10, 2014, 20:49
Коллеги, я правильно понимаю, чтобы записать двоичные данные в Blob Sqlite, их нужно преобразовать в текстовый формат, например, путем кодирования в base64? Иначе говоря, QByteArray, содержащий нули (0x00) записать без преобразования не удастся?


Название: Re: Запись двоичных даннных в SQLITE 3
Отправлено: Old от Июнь 10, 2014, 20:56
А что показали тесты?


Название: Re: Запись двоичных даннных в SQLITE 3
Отправлено: Bepec от Июнь 10, 2014, 20:59
sqlite насквозь текстовый. Преобразуйте в hex и будет вам счастье.


Название: Re: Запись двоичных даннных в SQLITE 3
Отправлено: sergek от Июнь 11, 2014, 06:58
А что показали тесты?
Так то и показали... Но на упаковке написано "Blob", что ж, мне глазам не верить? :)
sqlite насквозь текстовый. Преобразуйте в hex и будет вам счастье.
А в хексах он гораздо длиннее...


Название: Re: Запись двоичных даннных в SQLITE 3
Отправлено: Bepec от Июнь 11, 2014, 14:44
Ну как ни гонись за скоростью, но SQLite именно Lite. Серьёзной скорости от него не добиться на больших массивах.
На преобразовании в строку теряется больше времени, чем на запись в базу :)


Название: Re: Запись двоичных даннных в SQLITE 3
Отправлено: sergek от Июнь 11, 2014, 18:12
Ну как ни гонись за скоростью, но SQLite именно Lite. Серьёзной скорости от него не добиться на больших массивах.
На преобразовании в строку теряется больше времени, чем на запись в базу :)
Согласен, конечно. Про хексы - это на рефлексах. Если можно сделать лучше, то нельзя делать как придется ;)
Вообще-то я делаю прототип, маленький кусочек. В проме это будет работать на MySQL.
И все равно, не могу понять Blob в Sqlite - что это за large B...


Название: Re: Запись двоичных даннных в SQLITE 3
Отправлено: mitrich от Июнь 12, 2014, 00:02
sqlite насквозь текстовый. Преобразуйте в hex и будет вам счастье.
Никакой он не текстовый, бинарные данные хранит как положено и преобразовывать ничего не надо. Функция sqlite3_bind_blob (http://www.sqlite.org/c3ref/bind_blob.html) одним из параметров принимает размер данных.

И в драйвере, в зависимости от типа передаваемых данных используются нужные вызовы API:
Код
C++ (Qt)
switch (value.type()) {
case QVariant::ByteArray: {
   const QByteArray *ba = static_cast<const QByteArray*>(value.constData());
   res = sqlite3_bind_blob(d->stmt, i + 1, ba->constData(),
                           ba->size(), SQLITE_STATIC);
   break; }
 

Если не удаётся записать, может в QSqlQuery::bindValue() данные как-то неправильно передаете (напр., в виде char* вместо QByteArray)?

Код
C++ (Qt)
QSqlQuery query;
query.exec("CREATE TABLE t (              "
          "    id   INTEGER PRIMARY KEY, "
          "    data BLOB                 "
          ");                            ");
 
QByteArray data;
data.resize(5);
data[0] = 1;
data[1] = 0;
data[2] = 1;
data[3] = 0;
data[4] = 1;
 
query.prepare("INSERT INTO t(data) VALUES(?);");
query.bindValue(0, QVariant(data));
query.exec();
 


Название: Re: Запись двоичных даннных в SQLITE 3
Отправлено: sergek от Июнь 16, 2014, 17:18
Спасибо! Был не прав, все пишется. Подвела смотрелка :(