SQLite (, ) — компактная встраиваемая СУБД. Исходный код библиотеки передан в общественное достояние. В 2005 году проект получил награду Google-O’Reilly Open Source Awards.
Устройство Слово «встраиваемый» () означает, что SQLite не использует парадигмы клиент-сервер, то есть движок SQLite не является отдельно работающим процессом, с которым взаимодействует программа, а представляет собой библиотеку, с которой программа компонуется, и движок становится составной частью программы. Таким образом, в качестве протокола обмена используются вызовы функций (API) библиотеки SQLite. Такой подход уменьшает накладные расходы, время отклика и упрощает программу. SQLite хранит всю базу данных (включая определения, таблицы, индексы и данные) в единственном стандартном файле на том компьютере, на котором исполняется программа. Простота реализации достигается за счёт того, что перед началом исполнения транзакции записи весь файл, хранящий базу данных, блокируется; ACID-функции достигаются в том числе за счёт создания файла журнала.
Несколько процессов или потоков могут одновременно без каких-либо проблем читать данные из одной базы. Запись в базу можно осуществить только в том случае, если никаких других запросов в данный момент не обслуживается; в противном случае попытка записи оканчивается неудачей, и в программу возвращается код ошибки. Другим вариантом развития событий является автоматическое повторение попыток записи в течение заданного интервала времени.
В комплекте поставки идёт также функциональная клиентская часть в виде исполняемого файла sqlite3, с помощью которого демонстрируется реализация функций основной библиотеки. Клиентская часть является кроссплатформенной утилитой командной строки.
SQLite возможно использовать как на встраиваемых системах, так и на выделенных машинах с гигабайтными массивами данных.
Типы данных SQLite поддерживает динамическое типизирование данных. Возможные типы значений: INTEGER, REAL, TEXT и BLOB. Также поддерживается специальное значение NULL.
Размеры значений типа TEXT и BLOB не ограничены ничем, кроме константы SQLITE_MAX_LENGTH в исходном коде SQLite, равной 1 ГБ.
Каждое значение в любом поле любой записи может быть любого из этих типов, независимо от типа, указанного при объявлении полей таблицы. Указанный при объявлении поля тип хранится для справки в его исходном написании, и используется в качестве основы для выбора предпочтений (так называемое type affinity — это подход, редко встречающийся в других СУБД) при выполнении неявных преобразований типов на основании похожести этого названия типа на что-либо, знакомое SQLite. В этот алгоритм зашит обширный перечень практикуемых в других СУБД вариантов названий типов данных. Если безопасного преобразования записываемого значения в предпочитаемый тип не получается, SQLite записывает значение в его исходном виде. Для получения значений из базы есть ряд функций для каждого из типов, и если тип хранимого значения не соответствует запрашиваемому, оно тоже, по возможности, преобразуется.
Ограничения
Старые версии SQLite были спроектированы без каких-либо ограничений, единственным условием было то, чтобы база данных умещалась в памяти, в которой все вычисления производились при помощи 32-разрядных целых чисел. Это создавало определённые проблемы. Из-за того, что верхние пределы не были определены и соответственно должным образом протестированы, часто обнаруживались ошибки при использовании SQLite в достаточно экстремальных условиях. Поэтому в новых версиях SQLite были введены пределы, которые теперь проверяются вместе с общим набором тестов.
Во время компиляции библиотеки SQLite устанавливаются следующие ограничения, которые можно, при острой необходимости, увеличивать:
ОписаниеЗначениеКонстанта в исходном коде Максимальная длина строки или BLOB-поля, байт1 000 000 000SQLITE_MAX_LENGTH Максимальное количество колонок2 000SQLITE_MAX_COLUMN Максимальная длина SQL-выражения1 000 000 000SQLITE_MAX_SQL_LENGTH Максимальное количество таблиц в выражениях с JOIN64 Максимальная глубина дерева выражений1 000SQLITE_MAX_EXPR_DEPTH Максимальное количество аргументов функции127SQLITE_MAX_FUNCTION_ARG Максимальное количество термов в объединённом выражении с SELECT500SQLITE_MAX_COMPOUND_SELECT Максимальная длина шаблона как аргумента операторов LIKE или GLOB50 000SQLITE_MAX_LIKE_PATTERN_LENGTH Максимальное количество символов-заменителей в одном SQL-выражении999SQLITE_MAX_VARIABLE_NUMBER Максимальная глубина рекурсии триггеров1 000SQLITE_MAX_TRIGGER_DEPTH Максимальное количество присоединённых баз10SQLITE_MAX_ATTACHED Максимальный размер страницы базы данных65 536SQLITE_MAX_PAGE_SIZE Максимальное количество страниц в файле базы данных1 073 741 823SQLITE_MAX_PAGE_COUNT
Для версии 3.37.0 значение SQLITE_MAX_PAGE_SIZE не может быть больше заданного по умолчанию, что прямо указано в исходном коде. Максимальное количество страниц в БД 4294967294. Таким образом, максимальный размер БД составляет 256 ТиБ.
Некоторые ограничения можно менять в сторону уменьшения во время исполнения программы при помощи задания категории и соответствующего значения функции sqlite3_limit():
int sqlite3_limit(sqlite3*, int id, int newVal)
КатегорияОписание SQLITE_LIMIT_LENGTHМаксимальная длина любой строки или BLOB-поля или ряда SQLITE_LIMIT_SQL_LENGTHМаксимальная длина SQL-выражения SQLITE_LIMIT_COLUMNМаксимальное количество колонок в определении таблицы или результате выборки, или индексе, или выражениях с операторами ORDER BY или GROUP BY SQLITE_LIMIT_EXPR_DEPTHМаксимальная глубина разобранного дерева любого выражения SQLITE_LIMIT_COMPOUND_SELECTМаксимальное количество термов в объединённом выражении с SELECT SQLITE_LIMIT_VDBE_OPМаксимальное количество инструкций программы виртуальной машины выполняемого SQL-выражения SQLITE_LIMIT_FUNCTION_ARGМаксимально количество аргументов функции SQLITE_LIMIT_ATTACHEDМаксимальное количество присоединённых баз SQLITE_LIMIT_LIKE_PATTERN_LENGTHМаксимальная длина шаблона как аргумента операторов LIKE или GLOB SQLITE_LIMIT_VARIABLE_NUMBERМаксимальное количество переменных в SQL-выражении, которые можно связать SQLITE_LIMIT_TRIGGER_DEPTHМаксимальная глубина рекурсии триггеров
Это может быть полезным, если SQLite используется в веб-приложениях, так как уменьшенные пределы могут предотвратить DoS-атаки со стороны недоверяемых внешних клиентов.
Использование Сама библиотека SQLite написана на C; существует большое количество привязок к другим языкам программирования, в том числе Apple Swift, Delphi, C++, Java, Kotlin, C#, VB.NET, Python, Perl, Node.js, PHP, PureBasic, Tcl (средства для работы с Tcl включены в комплект поставки SQLite), Ruby, Haskell, Scheme, Smalltalk, Lua и Parser, а также ко многим другим. Полный список существующих средств размещён на странице проекта.
Простота и удобство встраивания SQLite привели к тому, что библиотека используется в браузерах, музыкальных плеерах и многих других программах.
В частности, SQLite используется в:
Adobe Integrated Runtime — среда для запуска приложений (частично); Gears; Autoit; Фреймворк Qt; Платформа XUL на движке Gecko 1.9+, XULRunner 1.9+ и, потенциально, все приложения, основанные на этой платформе, в том числе: Mozilla Firefox (начиная с версии 3.0) Mozilla Thunderbird (начиная с версии 3.0) Songbird SQLite Manager. Skype; Viber; Некоторые модели GPS-навигаторов Garmin
Многие программы поддерживают SQLite в качестве формата хранения данных (особенно в Mac OS и iOS, Android), в том числе:
1С:Предприятие 7.7 (с помощью внешнего компонента); 1С:Предприятие 8.3 (для хранения записей журнала регистрации); Adobe Photoshop Lightroom; FlylinkDC++; AIMP; Banshee; Calibre; Eserv; F-Spot; Nextcloud; FAR Manager (начиная с версии 3.0); Gajim; Google Chrome; Miranda IM (с помощью плагина драйвера базы данныхdbRW Database Driver 1.2 ); MyChat; Opera (начиная с версии 10.50); qutIM; QGIS; Safari; XnView; Garena.
См. также Apache Derby
Примечания
Ссылки Официальный сайт Список программ для администрирования SQLite Самоучитель SQLite
Категория:Свободные СУБД Категория:Программное обеспечение в общественном достоянии Категория:Свободные библиотеки программ Категория:Реляционные СУБД Категория:Свободное программное обеспечение, написанное на Си Категория:Свободное кроссплатформенное программное обеспечение