Вопрос по blob, c++, stl – представляющие BLOB в C ++

4

Существуют ли контейнеры STL, которые, по-видимому, хорошо подходят для использования в качестве BLOB-объектов для программного обеспечения баз данных? Я бы подумалvector<char>, но есть ли что-то лучше? Может бытьstd::string? Или какой-нибудь не-STL контейнер?

@baruch:signed char а такжеunsigned char арифметические, целочисленные типы так же, какint а такжеunsigned int, С другой стороны,char явно подразумевается как «I / O»; тип, представляющий некоторую непрозрачную системную базовую единицу данных на вашей платформе. Я бы использовал их в этом духе. Kerrek SB
@KerrekSB Ну, концептуально это так. А концептуально строка - плохая идея для нетекстового использования. Концептуально, конечно. Christian Rau
@ChristianRau:char не является "текстовым символом".string неплохая идея Kerrek SB
Ну, это текстовая строка? Если нет (так как BLOB - просто куча бинарного мусора), тоstd::string плохая идея В этом же смысле векторchars (которые являются текстовыми символами) плохая идея, по сравнению с векторомunsigned chars. Christian Rau
@ChristianRau: Нет. Концептуально,char это наименьшая адресуемая единица данных и базовая единица ввода / вывода. Таким образом, это действительно идеальный тип для представления произвольных данных. Единственное, что не так сchar это его собственное имя. Kerrek SB

Ваш Ответ

3   ответа
2

streams в одном из наших проектов для представления значений BLOB / CLOB, хранящихся в базе данных. Я думаю, что в большинстве случаев это лучший подход, так как BLOB / CLOB могут быть действительно большими, чтобы поместиться в память по определению.

Напишиstream реализация своей собственной и использовать его, как и любой другойstream.

2

std::string хранить большие двоичные объекты, поскольку я использую GoogleБуферы протокола библиотека для сериализации объектов и то, что они используют (например,MessageLite :: SerializeToString). Это хорошо работает для моих целей, поскольку вставить полученную строку в виде большого двоичного объекта в базу данных SQLite очень просто:

sqlite3_bind_blob(_insert_statement, 3, data.c_str(), data.size(), SQLITE_STATIC);

(data этоstd::string будучи связанным в качестве третьего аргумента_insert_statement.)

Как вы заполняете строку?
Посмотрите наProtocol Buffers example; вместоperson.SerializeToOstream(&output) я используюperson.SerializeAsString() а затем использовать результат в качестве BLOB-объекта SQLite. Там такжеSerializeToString(std::string*) если вы действительно хотите избежать копирования.
9

BLOB Тип баз данных позволяет хранить двоичные данные, поэтому вам необходим упорядоченный набор байтов. Самый простой выбор будетvector<> и вы могли бы выбратьunsigned char представлять байт на большинстве платформ

Похожие вопросы