Перейти к содержанию

SQLite

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис
(перенаправлено с «SQLite3»)
SQLite
Логотип программы SQLite
Скриншот программы SQLite
Тип Встраиваемая СУБД
Разработчик Ричард Хипп
Написана на Си
Операционная система кроссплатформенность
Первый выпуск август 2000
Последняя версия 3.46.0 (23 мая 2024)
Читаемые форматы файлов .sqlite, .sqlite3, .db, .db3, .sl3
Создаваемые форматы файлов .sqlite, .sqlite3, .db, .db3, .sl3
Лицензия Общественное достояние
Ссылки
Сайт sqlite.org  (англ.)
sqlite.org/src

SQLite (/ˌɛsˌkjuːˌɛlˈt/,[1][2] /ˈskwəˌlt/[3]) — компактная встраиваемая СУБД. Исходный код библиотеки передан в общественное достояние. В 2005 году проект получил награду Google-O’Reilly Open Source Awards[4].

Устройство

Слово «встраиваемый» (англ. embedded) означает, что SQLite не использует парадигмы клиент-сервер, то есть движок SQLite не является отдельно работающим процессом, с которым взаимодействует программа, а представляет собой библиотеку, с которой программа компонуется, и движок становится составной частью программы. Таким образом, в качестве протокола обмена используются вызовы функций (API) библиотеки SQLite. Такой подход уменьшает накладные расходы, время отклика и упрощает программу. SQLite хранит всю базу данных (включая определения, таблицы, индексы и данные) в единственном стандартном файле на том компьютере, на котором исполняется программа. Простота реализации достигается за счёт того, что перед началом исполнения транзакции записи весь файл, хранящий базу данных, блокируется; ACID-функции достигаются в том числе за счёт создания файла журнала.

Несколько процессов или потоков могут одновременно без каких-либо проблем читать данные из одной базы. Запись в базу можно осуществить только в том случае, если никаких других запросов в данный момент не обслуживается; в противном случае попытка записи оканчивается неудачей, и в программу возвращается код ошибки. Другим вариантом развития событий является автоматическое повторение попыток записи в течение заданного интервала времени.

Архитектура SQLite

В комплекте поставки идёт также функциональная клиентская часть в виде исполняемого файла sqlite3, с помощью которого демонстрируется реализация функций основной библиотеки. Клиентская часть является кроссплатформенной утилитой командной строки.

SQLite возможно использовать как на встраиваемых системах, так и на выделенных машинах с гигабайтными массивами данных.

Типы данных

SQLite поддерживает динамическое типизирование данных. Возможные типы значений: INTEGER, REAL, TEXT и BLOB. Также поддерживается специальное значение NULL.[5]

Размеры значений типа TEXT и BLOB не ограничены ничем, кроме константы SQLITE_MAX_LENGTH в исходниках SQLite, равной миллиарду (109)[6].

Каждое значение в любом поле любой записи может быть любого из этих типов, независимо от типа, указанного при объявлении полей таблицы. Указанный при объявлении поля тип хранится для справки в его исходном написании, и используется в качестве основы для выбора предпочтений (так называемое «type affinity»: это подход, редко встречающийся в других СУБД) при выполнении неявных преобразований типов на основании похожести этого названия типа на что-либо, знакомое SQLite. В этот алгоритм зашит обширный перечень практикуемых в других СУБД вариантов названий типов данных. Если безопасного преобразования записываемого значения в предпочитаемый тип не получается, SQLite записывает значение в его исходном виде. Для получения значений из базы есть ряд функций для каждого из типов, и если тип хранимого значения не соответствует запрашиваемому, оно тоже, по возможности, преобразуется.[7]

Ограничения

Старые версии SQLite были спроектированы без каких-либо ограничений, единственным условием было то, чтобы база данных умещалась в памяти, в которой все вычисления производились при помощи 32-разрядных целых чисел. Это создавало определённые проблемы. Из-за того, что верхние пределы не были определены и соответственно должным образом протестированы, часто обнаруживались ошибки при использовании SQLite в достаточно экстремальных условиях. Поэтому в новых версиях SQLite были введены пределы, которые теперь проверяются вместе с общим набором тестов.

Во время компиляции библиотеки SQLite устанавливаются следующие ограничения, которые можно, при острой необходимости, увеличивать:

Описание Значение Константа в исходном коде
Максимальная длина строки или BLOB-поля 1 000 000 000 SQLITE_MAX_LENGTH
Максимальное количество колонок 2 000 SQLITE_MAX_COLUMN
Максимальная длина SQL-выражения 1 000 000 000 SQLITE_MAX_SQL_LENGTH
Максимальное количество таблиц в выражениях с JOIN 64
Максимальная глубина дерева выражений 1 000 SQLITE_MAX_EXPR_DEPTH
Максимальное количество аргументов функции 127 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
Максимальный размер страницы базы данных 65 536 SQLITE_MAX_PAGE_SIZE
Максимальное количество страниц в файле базы данных 1 073 741 823 SQLITE_MAX_PAGE_COUNT

Для версии 3.37.0 значение SQLITE_MAX_PAGE_SIZE не может быть больше заданного по умолчанию, что прямо указано в исходном коде. Максимальное количество страниц в БД 4294967294. Таким образом, максимальный размер БД составляет 1.4e+14 байтов (281 десятичный терабайт или 256 ТиБ).[8]

Некоторые ограничения можно менять в сторону уменьшения во время исполнения программы при помощи задания категории и соответствующего значения функции 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, C#, VB.NET, Python, Perl, Node.js, PHP, PureBasic[9], Tcl (средства для работы с Tcl включены в комплект поставки SQLite), Ruby, Haskell, Scheme, Smalltalk, Lua и Parser, а также ко многим другим. Полный список существующих средств размещён на странице проекта[10].

Простота и удобство встраивания SQLite привели к тому, что библиотека используется в браузерах, музыкальных плеерах и многих других программах.

В частности, SQLite используется в:

Многие программы поддерживают SQLite в качестве формата хранения данных (особенно в Mac OS и iOS, Android), в том числе:

См. также

Примечания

  1. «Why SQLite succeeded as a database — Richard Hipp, creator of SQLite». The Changelog. Серия 201. Event occurs at 00:17:25.«How do I pronounce the name of the product? I say S-Q-L-ite, like a mineral.»
  2. D. Richard Hipp (presenter). An Introduction to SQLite (video). Google Inc.. Время от начала источника: 00:01:14. «[...] ess-kju-ellite [...]»
  3. D. Richard Hipp (presenter). An Introduction to SQLite. Google Inc.. Время от начала источника: 00:48:15. «[...] sequelite [...]»
  4. Google-O’Reilly Open Source Awards — Hall of Fame — Google Code. Дата обращения: 5 марта 2010. Архивировано 11 июля 2011 года.
  5. Архивированная копия (недоступная ссылка). Дата обращения: 11 марта 2019. Архивировано 13 февраля 2019 года. (англ.)
  6. (англ.) Implementation Limits For SQLite. Дата обращения: 23 ноября 2018. (англ.) Архивировано 8 января 2019 года.
  7. Архивированная копия (недоступная ссылка). Дата обращения: 11 марта 2019. Архивировано 10 марта 2019 года. (англ.)
  8. Implementation Limits For SQLite. Дата обращения: 8 декабря 2021. Архивировано 7 ноября 2021 года.
  9. Функция UseSQLiteDatabase(). Дата обращения: 28 сентября 2013. Архивировано 2 октября 2013 года.
  10. Список привязок SQLite для других языков (недоступная ссылка). Дата обращения: 4 апреля 2007. Архивировано 5 февраля 2009 года.
  11. sqlite-manager — Project Hosting on Google Code. Дата обращения: 5 марта 2010. Архивировано 9 февраля 2010 года.
  12. Skype client using SQLite? (недоступная ссылка). Дата обращения: 7 мая 2010. Архивировано 28 сентября 2014 года.
  13. sqlite1c — Project Hosting on Google Code. Дата обращения: 5 августа 2008. Архивировано 12 апреля 2009 года.
  14. Как мы улучшили журнал регистрации. 1С (29 октября 2013). Дата обращения: 1 июля 2014. Архивировано 27 августа 2014 года.
  15. dbRW Database Driver 1.2 Архивировано 1 мая 2011 года.

Ссылки