Чтобы сохранить изображение в SQLITE (, что не рекомендуется, лучше сохранить изображение в виде файла и сохранить путь в БД ), сохранить его как массив байтов (тип хранения BLOB, столбец не должен быть определен как BLOB).
В SQL вы указываете массив байтов в виде шестнадцатеричной строки. Итак, вы читаете свое изображение и строите шестнадцатеричную строку
* 1011 отмечая *
Максимальная длина строки или BLOB
Определено максимальное количество байтов в строке или BLOB в SQLite.
макросом препроцессора SQLITE_MAX_LENGTH. Значение по умолчанию этого
макрос - 1 миллиард (1 тысяча миллионов или 1 000 000 000). Вы можете
увеличить или уменьшить это значение во время компиляции, используя параметр командной строки
как это:
-DSQLITE_MAX_LENGTH = 123456789 Текущая реализация будет поддерживать только строку или длину BLOB до 231-1 или 2147483647. И некоторые
встроенные функции, такие как hex (), могут выйти из строя задолго до этого. В
чувствительных к безопасности приложений лучше не пытаться увеличить
максимальная длина строки и капли. На самом деле, вы могли бы преуспеть, чтобы снизить
максимальная длина строки и BLOB-объекта до чего-то большего в диапазоне
несколько миллионов, если это возможно.
Во время обработки SQLite INSERT и SELECT завершается
содержимое каждой строки в базе данных кодируется как один большой двоичный объект. Так
параметр SQLITE_MAX_LENGTH также определяет максимальное количество
байт подряд.
Максимальная длина строки или BLOB может быть уменьшена во время выполнения с помощью
Интерфейс sqlite3_limit (дБ, SQLITE_LIMIT_LENGTH, размер).
Также
- отмечая
Максимальная длина оператора SQL
Максимальное количество байтов в тексте оператора SQL ограничено
в SQLITE_MAX_SQL_LENGTH, который по умолчанию равен 1000000. Вы можете переопределить
этот предел должен быть таким же большим, как и меньшее из SQLITE_MAX_LENGTH и
1073741824.
Если оператор SQL ограничен длиной в миллион байтов, то
очевидно, вы не сможете вставить многомиллионные строки байтов
встраивая их как литералы внутри операторов INSERT. Но ты должен
не делай этого в любом случае. Используйте параметры хоста для ваших данных. Готовь коротко
SQL-операторы вроде этого:
INSERT INTO tab1 VALUES (?,?,?); Затем используйте sqlite3_bind_XXXX ()
функции для привязки ваших больших строковых значений к оператору SQL.
использование связывания устраняет необходимость экранирования кавычек в
строка, снижающая риск атак SQL-инъекций. Это также работает
быстрее, так как большую строку не нужно анализировать или копировать как
много.
Максимальная длина оператора SQL может быть уменьшена во время выполнения
используя интерфейс sqlite3_limit (db, SQLITE_LIMIT_SQL_LENGTH, size).
Результирующий SQL будет выглядеть следующим образом: -
INSERT INTO mytable (myimage) VALUES (x'fffe004577aabbcc33f1f8');
В качестве демонстрации с использованием вашей таблицы (слегка изменено, чтобы включить "правильный" тип столбца BLOB, что не имеет большого значения): -
DROP TABLE If EXISTS sprint_names;
CREATE TABLE if not exists sprint_names ( name text, image text, altimage BLOB);
INSERT INTO sprint_names VALUES
('SPRINT001',x'fffe004577aabbcc33f1f8',x'fffe004577aabbcc33f1f8'), -- obviously image would be larger
('SPRINT002',x'99008877665544332211f4d6e9c2aaa8b7b4',x'99008877665544332211f4d6e9c2aaa8b7b4')
;
SELECT * FROM sprint_names;
Результат будет: -
- Примечание. Navicat использовался для запуска текста выше. BLOB-объекты по своей сути трудно отображать, следовательно, отображать. Однако показано, что вышеприведенное явно хранит и извлекает данные.
Как указывалось ранее, гораздо проще просто сохранить путь к файлу изображения, и когда он сводится к нему, вероятно, очень мало потребности в изображении в качестве данных. Вы вряд ли будете запрашивать данные, из которых состоит изображение, в то время как использование стандартов именования может позволить полезные поиски / запросы сохраненного имени / пути.
Однако, вопреки вышесказанному, SQLite может в некоторых случаях (изображения со средним размером около 100 КБ или меньше (возможно, больше)) обеспечить более быстрый доступ, чем файловая система 35% быстрее, чем файловая система .