SQLite — компактная встраиваемая реляционная база данных. Исходный код библиотеки передан в общественное достояние. В 2005 году проект получил награду Google-O’Reilly Open Source Awards.
Слово “встраиваемый” означает, что SQLite не использует парадигму клиент-сервер, то есть движок SQLite не является отдельно работающим процессом, с которым взаимодействует программа, а предоставляет библиотеку, с которой программа компонуется и движок становится составной частью программы. Таким образом, в качестве протокола обмена используются вызовы функций (API) библиотеки SQLite. Такой подход уменьшает накладные расходы, время отклика и упрощает программу. SQLite хранит всю базу данных (включая определения, таблицы, индексы и данные) в единственном стандартном файле на том компьютере, на котором исполняется программа. Простота реализации достигается за счёт того, что перед началом исполнения транзакции записи весь файл, хранящий базу данных, блокируется; ACID-функции достигаются в том числе за счёт создания файла журнала.
Несколько процессов или потоков могут одновременно без каких-либо проблем читать данные из одной базы. Запись в базу можно осуществить только в том случае, если никаких других запросов в данный момент не обслуживается; в противном случае попытка записи оканчивается неудачей, и в программу возвращается код ошибки. Другим вариантом развития событий является автоматическое повторение попыток записи в течение заданного интервала времени.
В комплекте поставки идёт также функциональная клиентская часть в виде исполняемого файла sqlite3, с помощью которого демонстрируется реализация функций основной библиотеки. Клиентская часть работает из командной строки, позволяет обращаться к файлу БД на основе типовых функций ОС.
Благодаря архитектуре движка возможно использовать SQLite как на встраиваемых системах, так и на выделенных машинах с гигабайтными массивами данных.
Старые версии SQLite были спроектированы без каких-либо ограничений, единственным условием было то, чтобы база данных умещалась в памяти, в которой все вычисления производились при помощи 32-разрядных целых чисел. Это создавало определённые проблемы. Из-за того, что верхние пределы не были определены и соответственно должным образом протестированы, то частенько наружу вылезали ошибки при использовании SQLite в достаточно экстремальных условиях. И поэтому, в новых версиях SQLite были введены пределы, которые теперь проверяются вместе с общим набором тестов.
Во время компиляции библиотеки SQLite устанавливаются следующие ограничения, которые можно при острой необходимости увеличивать:
Описание |
Значение |
Константа в исходнике |
Максимальная длина строки или BLOB-поля |
1 000 000 000 |
SQLITE_MAX_LENGTH |
Максимальное количество колонок |
2 000 |
SQLITE_MAX_COLUMN |
Максимальная длина SQL-выражения |
1 000 000 |
SQLITE_MAX_SQL_LENGTH |
Максимальное количество таблиц в выражениях с JOIN |
64 |
|
Максимальная глубина дерева выражений |
1 000 |
SQLITE_MAX_EXPR_DEPTH |
Максимальное количество аргументов функции |
100 |
SQLITE_MAX_FUNCTION_ARG |
Максимальное количество термов в объединённом выражении с SELECT |
500 |
SQLITE_MAX_COMPOUND_SELECT |
Максимальная длина шаблона как аргумента операторов LIKE или GLOB |
50 000 |
SQLITE_MAX_LIKE_PATTERN_LENGTH |
Максимальное количество символов-заменителей в одном SQL-выражении |
999 |
SQLITE_MAX_VARIABLE_NUMBER |
Максимальная глубина рекурсии триггеров |
1 000 |
SQLITE_MAX_TRIGGER_DEPTH |
Максимальное количество присоединённых баз |
10 |
SQLITE_MAX_ATTACHED |
Максимальный размер страницы базы данных |
32 768 |
SQLITE_MAX_PAGE_SIZE |
Максимальное количество страниц в файле базы данных |
1 073 741 823 |
SQLITE_MAX_PAGE_COUNT |
На текущий момент только значение SQLITE_MAX_PAGE_SIZE не может быть больше заданного по умолчанию. Таким образом, не изменяя SQLITE_MAX_PAGE_COUNT, можно сказать, что максимальный размер файла базы данных составляет примерно 32ТБ (35.184.372.056.064 байт).Некоторые ограничения можно менять в сторону уменьшения во время исполнения программы при помощи задания категории и соответствующего значения функции 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; существует большое количество привязок к другим языкам программирования, в том числе C++, Java, C#, VB.NET, Python, Perl, PHP, Tcl (средства для работы с Tcl включены в комплект поставки SQLite), Ruby, Haskell, Scheme, Smalltalk, Lua и Parser, а также ко многим другим. Полный список существующих средств размещён на странице проекта.
Простота и удобство встраивания SQLite привели к тому, что библиотека используется в браузерах, музыкальных плеерах и многих других программах.
В частности, SQLite используют:
Многие программы поддерживают SQLite в качестве формата хранения данных (особенно в Mac OS и iPhone OS, Android), в том числе:
Когда тот или иной физик использует понятие "физический вакуум", он либо не понимает абсурдности этого термина, либо лукавит, являясь скрытым или явным приверженцем релятивистской идеологии.
Понять абсурдность этого понятия легче всего обратившись к истокам его возникновения. Рождено оно было Полем Дираком в 1930-х, когда стало ясно, что отрицание эфира в чистом виде, как это делал великий математик, но посредственный физик Анри Пуанкаре, уже нельзя. Слишком много фактов противоречит этому.
Для защиты релятивизма Поль Дирак ввел афизическое и алогичное понятие отрицательной энергии, а затем и существование "моря" двух компенсирующих друг друга энергий в вакууме - положительной и отрицательной, а также "моря" компенсирующих друг друга частиц - виртуальных (то есть кажущихся) электронов и позитронов в вакууме.
Однако такая постановка является внутренне противоречивой (виртуальные частицы ненаблюдаемы и их по произволу можно считать в одном случае отсутствующими, а в другом - присутствующими) и противоречащей релятивизму (то есть отрицанию эфира, так как при наличии таких частиц в вакууме релятивизм уже просто невозможен). Подробнее читайте в FAQ по эфирной физике.