![]() |
|
|||
WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
Короткий ответ: колонка, объявленная
INTEGER PRIMARY KEY,
будет autoincrement. Более длинный ответ: Если вы объявляете, что колонка таблицы
INTEGER PRIMARY KEY,
то каждый раз, когда вы вставляете NULL в ту колонку таблицы, NULL
автоматически преобразовывается в целое число, которое является на единицу
больше, чем самое большое значение той колонки по всем другим строкам в
таблице или 1, если таблица пуста. Или, если самый большой существующий ключ
целого числа 9223372036854775807 используется, неиспользованное значение
ключа выбрано наугад. Например, предположите, что у вас есть таблица:
С этой таблицей запрос логически эквивалентен высказыванию: Есть функция, названная
sqlite3_last_insert_rowid(),
которая возвратит ключ целого числа для новой операции по вставке. Обратите внимание на то, что ключ целого числа на единицу больше,
чем самый большой ключ, который был в таблице до вставки.
Новый ключ в настоящее время будет уникален по всем ключам в таблице, но это
могло бы наложиться с ключами, которые были ранее удалены из таблицы.
Чтобы создать ключи, которые уникальны по целой жизни таблицы,
добавьте ключевое слово AUTOINCREMENT
в определение INTEGER PRIMARY KEY.
Тогда выбранный ключ будет на единицу больше, чем самый большой ключ, который
когда-либо существовал в таблице.
Если самый большой ключ ранее существовал в таблице,
INSERT потерпит неудачу с кодом ошибки
SQLITE_FULL. (2)Какие типы данных поддерживает SQLite? (3) SQLite позволяет мне вставить последовательность в колонку
базы данных целого числа! Это особенность, а не ошибка.
SQLite использует динамический контроль типов.
Это не проводит в жизнь ограничения типа данных. Данные любого типа могут
(обычно) вставляться в любую колонку. Можно поместить последовательности
произвольной длины в колонки целого числа, числа с плавающей точкой в булевых
колонках или даты в колонках символов. Тип данных
, который вы назначаете на колонку в команде CREATE TABLE, не
ограничивает, какие данные могут быть помещены в ту колонку.
Каждая колонка в состоянии хранить строку произвольной длины.
Есть одно исключение: Колонки типа
INTEGER PRIMARY KEY
могут хранить только 64-битное целое число со знаком. Ошибка происходит при
попытке поместить что-нибудь кроме целого числа в столбец
INTEGER PRIMARY KEY. Но SQLite действительно использует заявленный тип колонки как намек,
что вы предпочитаете значения в том формате. Так, например, если колонка
будет иметь тип INTEGER, и вы пытаетесь вставить последовательность в ту
колонку, SQLite попытается преобразовать последовательность в целое число.
Если это возможно, это вставит целое число вместо этого.
В противном случае это вставляет последовательность. Эту особенность называют
близостью типа. (4)Почему SQLite, позволяют мне использовать '0' и '0.0'
как первичный ключ на двух различных строках той же таблицы? Эта проблема происходит, когда ваш первичный ключ
числовой тип. Измените тип данных
своего первичного ключа к TEXT, и это должно работать. У каждой строки должен быть уникальный первичный ключ.
Для колонки с числовым типом SQLite думает, что '0' и '0.0'
то же самое, потому что они выдерживают сравнение равенства друг другу
численно (см. предыдущий вопрос). Следовательно, значения не уникальны.
(5)Могут многочисленные приложения
обращаться к файлу единой базы данных в то же время? У многократных процессов может быть та же самая база данных,
открытая в то же время. Многократные процессы могут делать SELECT в то же
время. Но только один процесс может вносить изменения в базу данных в любой
момент времени, как бы то ни было. SQLite использует блокировки чтения/записи, чтобы управлять доступом к
базе данных. Под Win95/98/ME, которые испытывают недостаток в поддержке
такой блокировки, вероятностное моделирование используется вместо этого.
Но проявите осмотрительность: этот механизм блокировки не мог бы работать
правильно, если файл базы данных сохранен в файловой системе NFS.
Это вызвано тем, что блокировка файла fcntl() не работает
на многих внедрениях NFS. Необходимо избежать помещать файлы базы данных
SQLite на NFS, если многократные процессы могли бы попытаться получить доступ
к файлу в то же время. На Windows в документации Microsoft говорится, что
блокировка может не работать под файловыми системами FAT, если вы не
управляете демоном Share.exe. Люди, у которых есть большой опыт с Windows,
говорят мне, что блокировка сетевых файлов очень глючная и не надежная.
Если то, что они говорят, верно, разделение базы данных SQLite между двумя
или больше машинами Windows могло бы вызвать неожиданные проблемы. Мы не знаем ни о каком другом встроенном движке
базы данных SQL, который поддерживает столько же параллелизма, сколько
SQLite. SQLite позволяет многократным процессам иметь файл базы данных,
открытый сразу для многократных процессов, чтобы прочитать базу данных.
Когда любой процесс хочет написать данные, он должен блокировать
весь файл базы данных на время его обновления. Но это обычно занимает
только несколько миллисекунд. Другие процессы просто ждут окончания записи.
Другие встроенные СУБД SQL типично позволяют только единственному процессу
соединяться с базой данных сразу. Однако, ядра базы данных клиент-сервер (такие как PostgreSQL, MySQL или
Oracle) обычно поддерживают более высокий уровень параллелизма и позволяют
многократным процессам писать ту же самую базу данных в то же время.
Это возможно в базе данных клиент-сервер, потому что всегда есть единственный
хорошо управляемый серверный процесс, доступный, чтобы скоординировать
доступ. Если у вашего приложения есть потребность в большом параллелизме, то
необходимо рассмотреть использование базы данных клиент-сервер.
Но опыт показывает, что для большинства приложений
было нужно намного меньше параллелизма, чем их проектировщики воображают. Когда SQLite пытается получить доступ к файлу, который блокирован
другим процессом, поведение по умолчанию должно возвратить SQLITE_BUSY.
Можно приспособить это поведение из кода на C, используя API
sqlite3_busy_handler() или
sqlite3_busy_timeout().
(6) SQLite поточно-безопасный?
Потоки злые. Избегайте их.
SQLite ориентирован на многопотоковое исполнение. Мы идем на эту уступку,
так как многие пользователи принимают решение проигнорировать совет, данный в
предыдущем параграфе. Но чтобы быть ориентированным на многопотоковое
исполнение, SQLite должен быть собран с макросом препроцессора
SQLITE_THREADSAFE = 1. Windows и предварительно собранные пакеты Linux
собраны именно так. Если вы не уверены, что библиотека SQLite, с которой
вы компонуете, собрана, чтобы быть ориентированной на многопотоковое
исполнение, можно вызвать
sqlite3_threadsafe(). SQLite ориентирован на многопотоковое исполнение, потому что он использует
mutexes, чтобы преобразовать в последовательную форму доступ к структурам
общих данных. Однако работа приобретения и выпуска этих mutexes замедлит
SQLite немного. Следовательно, если вам не нужен SQLite, ориентированный на
многопотоковое исполнение, необходимо отключить mutexes для максимальной
производительности. См. документацию
здесь. В Unix вы не должны передать открытую базу данных SQLite через
системный вызов fork() в дочерний процесс. (7) Как перечислить все таблицы/индексы в базе данных SQLite Если вы управляете sqlite3 командной строки, можно
напечатать ".tables", чтобы получить список всех таблиц.
Или можно напечатать ".schema", чтобы видеть полную схему базы данных,
которая включает все таблицы и индексы. Любая из этих команд может
сопровождаться образцом LIKE, который ограничит таблицы. Из программы C/C++ (или скрипта на Tcl/Ruby/Perl/Python)
можно получить доступ к именам таблиц и именам индексов, делая SELECT на
специальной таблице под названием "SQLITE_SCHEMA".
У каждой базы данных SQLite есть таблица SQLITE_SCHEMA, которая определяет
схему для базы данных. SQLITE_SCHEMA похожа на это: Для таблиц поле type всегда 'table', поле name
будет названием таблицы. Таким образом, чтобы получить список всех
таблиц в базе данных, используйте следующую команду SELECT: Для индексов type = 'index', name это название
индекса, а tbl_name это название таблицы, которой принадлежит индекс.
Для таблиц и индексов поле sql это
текст оригинального CREATE TABLE или CREATE INDEX, который составил таблицу
или индекс. Для автоматически созданных индексов (используемых для
реализации ограничения PRIMARY KEY или UNIQUE) sql = NULL. Таблица SQLITE_SCHEMA не может быть изменена, используя UPDATE, INSERT или
DELETE (кроме экстраординарных
условий). Таблица SQLITE_SCHEMA автоматически обновляется командами
CREATE TABLE, CREATE INDEX, DROP TABLE и DROP INDEX. Временные таблицы не появляются в SQLITE_SCHEMA. Временные таблицы, их
индексы и триггеры происходят в другой специальной таблице
под названием SQLITE_TEMP_SCHEMA. Работает SQLITE_TEMP_SCHEMA точно так же,
как SQLITE_SCHEMA за исключением того, что это видимо только приложению,
которое составило временные таблицы. Чтобы получить список всех таблиц
можно использовать команду, подобную следующей:
(8) Какие известные пределы размера базам данных SQLite? См. limits.html
для полного обсуждения пределов SQLite. (9) Каков максимальный размер VARCHAR в SQLite? SQLite не проводит в жизнь длину VARCHAR. Можно объявить
VARCHAR (10), и SQLite будет рад сохранить 500 миллионов символьных строк
там. И это сохранит все 500 миллионов знаков в целости.
Ваше содержание никогда не усечено. SQLite понимает тип столбца
"VARCHAR(N)", чтобы совпасть с "TEXT",
независимо от значения N. (10) SQLite поддерживает тип BLOB? SQLite позволяет вам хранить данные BLOB в любой колонке, даже
колонках, которые, как объявляют, держат некоторый другой тип.
BLOB могут даже использоваться в качестве PRIMARY KEY. (11) Как я добавляю, удаляю или переименовываю колонки
существующей таблицы в SQLite? SQLite ограничил поддержку ALTER TABLE, которую можно
использовать, чтобы добавить, переименовать или пропустить колонки или
изменить название таблицы, как детализировано в
ALTER TABLE. Если вы хотите внести более сложные изменения в структуру
или ограничения таблицы или ее колонок, необходимо будет пересоздать ее.
Можно сохранить существующие данные во временной таблице, удалить старую,
составить новую таблицу, затем скопировать данные из
временной таблицы. Посмотрите
здесь. (12) Я удалил много данных, но файл базы данных не стал
намного меньше. Действительно ли это ошибка? Нет. Когда вы удаляете информацию из базы данных SQLite,
неиспользуемое пространство добавляется к внутреннему "free-list"
и снова используется в следующий раз, когда вы вставляете данные.
Дисковое пространство не потеряно.
Но при этом и не возвращено операционной системе. Если вы удаляете много данных и хотите сократить файл базы данных,
надо воспользоваться командой VACUUM.
VACUUM восстановит базу данных с нуля. Это оставит базу данных с пустым
свободным списком и файлом, который минимален в размере.
Отметьте, однако, что VACUUM может занять время и
может использовать до вдвое больше временного дискового пространства
по сравнению с оригинальным файлом в ходе работы. Альтернатива использованию команды VACUUM является автовакуумным режимом,
позволенным если использовать
auto_vacuum pragma. (13) Я могу использовать SQLite в своем коммерческом продукте,
не платя лицензионные платежи? Да. SQLite это public domain.
Никакая претензия собственности не предъявлена ни к какой части кода.
Можно сделать что-либо, что вы хотите, с ним. (14) Как я использую строковый литерал, который содержит
вложенную одинарную кавычку (')? Стандарт SQL определяет, что одинарных кавычек в
последовательностях избегают, помещая две одинарных кавычки подряд.
SQL работает как язык программирования Паскаль в этом отношении. Пример: (15) Что такое ошибка SQLITE_SCHEMA, и почему я получаю ее? Ошибка SQLITE_SCHEMA
возвращена, когда подготовленный SQL-оператор больше не действителен и
не может быть выполнен. Когда это происходит, запрос
должен быть повторно собран из SQL использованием
sqlite3_prepare() API.
Ошибка SQLITE_SCHEMA может произойти только, используя
sqlite3_prepare() и
sqlite3_step() для выполнения SQL.
Вы никогда не будете получать ошибку
SQLITE_SCHEMA из
sqlite3_exec().
И при этом вы не получите ошибку, если вы подготовите запрос, используя
sqlite3_prepare_v2() вместо
sqlite3_prepare(). sqlite3_prepare_v2() создает
подготовленный запрос, который автоматически
повторно соберет себя, если схема изменится. Самый легкий способ иметь дело с
ошибками SQLITE_SCHEMA
состоит в том, чтобы всегда использовать
sqlite3_prepare_v2() вместо
sqlite3_prepare(). (17) Я получаю некоторые предупреждения компилятора, когда я собираю
SQLite. Разве это не проблема? Разве это не указывает на
плохое качество кода? Гарантия качества в SQLite сделана, используя
тестирование полного охвата,
а не предупреждениями компилятора или другими статическими инструментами
анализа кода. Другими словами, мы проверяем, что SQLite на самом деле
получает правильный ответ, а не просто удовлетворяет стилистическим
ограничениям. Большая часть кодовой базы SQLite посвящена просто
тестированию. Десятки тысяч пробегов набора тестов SQLite отдельных тестовых
сценариев и многие из тех тестовых сценариев параметризуются так, чтобы сотни
миллионов тестов, включающих миллиарды SQL-операторов, были запущены и
оценены для правильности до каждого выпуска.
Разработчики используют кодовые инструменты освещения, чтобы проверить, что
все пути через код проверены. Каждый раз, когда ошибка найдена в SQLite,
новые тестовые сценарии написаны, чтобы показать ошибку так, чтобы ошибка не
могла незаметно повториться в будущем. Во время тестирования библиотека SQLite собрана со специальной
инструментовкой, которая позволяет сценариям тестирования моделировать
большое разнообразие неудач, чтобы проверить, что SQLite приходит в себя
правильно. Выделение памяти тщательно прослежено, и никакие утечки памяти не
происходят, даже после сбоев выделения памяти.
Специальный слой VFS используется, чтобы моделировать катастрофы операционной
системы и перебои в питании, чтобы гарантировать, что
транзакции атомные через эти события. Механизм для того, чтобы сознательно
ввести ошибки I/O показывает, что SQLite эластичен к таким сбоям.
Как эксперимент, попытайтесь вызвать эти виды ошибок на других движках
базы данных SQL и посмотрите, что происходит! Мы также управляем SQLite с использованием
Valgrind в Linux
и проверяем, что это не обнаруживает проблем. Некоторые люди говорят, что мы должны устранить все предупреждения, потому
что мягкие предупреждения маскируют реальные предупреждения, которые могли бы
возникнуть в будущих изменениях. Это достаточно верно.
Но в ответ, разработчики замечают, что все предупреждения были уже
исправлены при сборке используемого для развития SQLite
(различные версии GCC, MSVC и clang). Предупреждения компилятора обычно
являются только результатом действий компиляторов или вариантов времени
компиляции, которые разработчики SQLite не используют сами.
(18) Нечувствительное к регистру соответствие знаков
Unicode не работает. Вместо того, чтобы оказать полную поддержку
Unicode по умолчанию, SQLite обеспечивает способность скомпоновать для
внешнего сравнения Unicode и подпрограмм преобразования.
Применение может перегрузить встроенное сопоставление последовательности
NOCASE (через
sqlite3_create_collation())
и встроенные функции like(),
upper() и
lower()
(через sqlite3_create_function()).
Исходный код SQLite включает расширение "ICU", которое делает эти
перегрузки. Или разработчики могут написать свои собственные перегрузки на
основе их собственного Unicode-распорядка сравнения, уже содержащегося
в рамках их проекта. (19) INSERT действительно медленный, я могу только сделать
небольшое количество INSERT в секунду Операционная скорость ограничивается скоростью дисковода, потому что (по
умолчанию) SQLite на самом деле ждет, пока данные действительно безопасно не
сохранятся на поверхности диска, прежде чем транзакция закроется.
Если вы внезапно теряете питание
или если ваша OS терпит крах, ваши данные, все еще целы.
Для получения дополнительной информации об атомной передаче в SQLite см.
здесь.
По умолчанию каждый оператор INSERT это своя собственная транзакция.
Но если вы окружаете многократные операторы INSERT
BEGIN...
COMMIT, все вставки сгруппированы в единственную транзакцию.
Время, чтобы передать ее амортизируется по всем прилагаемым запросам
вставки и таким образом время на вставки значительно уменьшается.
Другой выбор состоит в том, чтобы управлять
PRAGMA synchronous=OFF.
Эта команда заставит SQLite не ждать точной записи данных,
это заставит операции записи казаться намного быстрее.
Но если вы теряете питание посреди транзакции, ваш файл базы данных
мог быть поврежден. (20) Я случайно удалил некоторую важную информацию из своей
базы данных SQLite. Как я могу возвратить ее? Если у вас нет резервной копии, восстановление очень трудное. Вы могли бы
быть в состоянии найти частичные данные о последовательности в дампе
двоичных данных сырого файла базы данных. Восстановление числовых данных
также может быть возможно специальными инструментами,
хотя никакие такие инструменты нам неизвестны. SQLite иногда собирается с
выбором SQLITE_SECURE_DELETE,
который переписывает все удаленное содержание с нолями. Если это так, тогда
восстановление явно невозможно.
Восстановление также невозможно, если вы управляли
VACUUM после того,
как данные были удалены. Если SQLITE_SECURE_DELETE не используется, и VACUUM
не управляли, то часть удаленного содержания могла бы все еще быть в файле
базы данных в областях, отмеченных для повторного использования.
Но там не существуют никакие процедуры или инструменты, о которых мы знаем,
чтобы помочь вам возвратить те данные. (21) Что за ошибка SQLITE_CORRUPT? Что означает для
базы данных "malformed"? Почему я получаю эту ошибку? Ошибка SQLITE_CORRUPT
возвращена, когда SQLite обнаруживает ошибку в структуре, формате или других
элементах управления файла базы данных. SQLite не портит файлы базы данных без внешней помощи.
Если ваше приложение развалилось посреди обновления,
ваши данные в безопасности. База данных безопасна, даже если
ваша OS зависнет. Сопротивление катастрофе в SQLite было экстенсивно изучено,
проверено и засвидетельствовано годами реального
опыта миллиардами пользователей. Однако, есть много вещей, которые внешние программы или ошибки в ваших
аппаратных средствах или OS могут сделать, чтобы испортить файл базы данных.
Посмотрите здесь.
Можно использовать
PRAGMA integrity_check, чтобы сделать более быстрый, но менее полный тест
на целостность БД. Можно использовать PRAGMA
quick_check, чтобы сделать полное, но длительное тестирование
на целостность БД. В зависимости от того, как ужасно ваша база данных испорчена, можно быть в
состоянии возвратить некоторые данные при помощи CLI, чтобы сдампить
схему и содержание к файлу и затем воссоздать. (22) SQLite поддерживает внешние ключи? С version 3.6.19
(2009-10-14) SQLite поддерживает
ограничения внешнего ключа. Но осуществление ограничений
внешнего ключа выключено по умолчанию (для обратной совместимости).
Чтобы позволить ограничительное осуществление внешнего ключа, управляйте
PRAGMA foreign_keys=ON
или соберите с
-DSQLITE_DEFAULT_FOREIGN_KEYS=1. (23) Я получаю ошибку компилятора, если я использую SQLITE_OMIT_...
варианты времени компиляции, строя SQLite. Возможно построить специальное
объединение, которое будет работать с
предопределенным набором SQLITE_OMIT_... Инструкции для этого
есть здесь. (24) Мое выражение WHERE column1="column1" не работает.
Это заставляет вернуть каждую строку таблицы, не только те, где у column1
есть значение "column1". SQL использует двойные кавычки вокруг идентификаторов (имена столбцов или
имена таблиц), которые содержат специальные символы или являются ключевыми
словами. Таким образом, двойные кавычки это способ экранировать
имя идентификатора. Следовательно, когда вы говорите
column1="column1", это эквивалентно
column1=column1, который, очевидно, всегда верен. (25) Как диаграммы синтаксиса (иначе диаграммы "railroad" diagrams)
создаются для SQLite? Много исторических версий документации SQLite использовали различный
процесс для создания диаграмм синтаксиса. Исторический процесс был основан на
Tcl/Tk и описан на
http://wiki.tcl-lang.org/21708.
Более новый Pikchr-синтаксис введен 2020-09-26. (26)Стандарт SQL требует, чтобы ограничение UNIQUE было проведено в
жизнь, даже если один или больше столбцов в ограничении NULL, но SQLite не
делает этого. Это не ошибка? (27) Каков Export Control Classification Number
(ECCN) для SQLite? Вышеупомянутое верно для основного общественного достояния SQLite.
Если вы расширяете SQLite, добавляя новый код,
или если вы статически связываете SQLite со своим приложением,
возможно надо изменить ECCN в вашем особом случае. (28) Мой запрос не возвращает имя столбца, которое я ожидаю.
Действительно ли это ошибка? (29) Куда моя база данных делась? Или как моя база
данных стала пустой?
Choose any three.
Frequently Asked Questions
Как я создаю поле AUTOINCREMENT?
CREATE TABLE t1(a INTEGER PRIMARY KEY, b INTEGER);
INSERT INTO t1 VALUES(NULL,123);
INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);
SQLite применяет динамическую типизацию
. Содержание может быть сохранено как
INTEGER, REAL, TEXT, BLOB или NULL.
CREATE TABLE sqlite_schema (type TEXT, name TEXT, tbl_name TEXT,
rootpage INTEGER, sql TEXT);
SELECT name FROM sqlite_schema WHERE type='table' ORDER BY name;
SELECT name FROM (SELECT * FROM sqlite_schema UNION ALL
SELECT * FROM sqlite_temp_schema) WHERE type='table' ORDER BY name
INSERT INTO xyz VALUES('5 O''clock');
Конфигурация по умолчанию SQLite поддерживает только
нечувствительные к регистру сравнения знаков ASCII.
Причина этого состоит в том, что, делая полные нечувствительные к регистру
сравнения и замены регистра Unicode, надо реализовать таблицы
и логику, которая почти удвоила бы размер библиотеки SQLite.
Разработчики SQLite рассуждают, что у любого применения, для которого нужна
полная поддержка Unicode, вероятно, уже, есть необходимые таблицы
и функции и таким образом, SQLite не должен занимать место, чтобы
дублировать эту способность.
На самом деле SQLite легко сделает 50,000 или больше
INSERT в секунду на среднем настольном
компьютере. Но это только сделает несколько дюжин транзакций в секунду.
Операционная скорость ограничивается скоростью вашего дисковода.
Транзакция обычно требует двух полных вращений подложки диска, которая на
дисководе на 7200 об/мин ограничивает вас
приблизительно 60 транзакциями в секунду.
Если вы имеете резервную копию своего файла базы данных,
возвращаете информацию от вашей резервной копии.
Варианты времени компиляции
SQLITE_OMIT_... работают только строя из канонических исходных файлов.
Они не работают, когда вы строите из SQLite
объединения
или из предварительно обработанных исходных файлов.
Используйте одинарные кавычки, не двойные кавычки, вокруг
строковых литералов в SQL. Это то, чего требует стандарт SQL.
Ваше выражение оператора Where должно выглядеть так:
column1='column1'
Каждая диаграмма написана от руки, используя язык
Pikchr.
Эти рукописные технические требования преобразовываются в SVG и вставляются
в файлы HTML как часть процесса сборки документации.
Возможно, вы обращаетесь к следующему заявлению от SQL92:
A unique constraint is satisfied if and only if no two rows in a
table have the same non-null values in the unique columns.
То заявление неоднозначно, имея по крайней мере две возможных интерпретации:
SQLite следует интерпретации (1), как делает PostgreSQL, MySQL, Oracle и
Firebird. Верно, что Informix и Microsoft SQL Server используют интерпретацию
(2), однако мы, разработчики SQLite, считаем, что
интерпретация (1) является самым естественным чтением требования, и мы также
хотим максимизировать совместимость с другими движками
базы данных SQL, а большинство других ядер базы данных также
ориентируются именно на (1).После тщательного обзора Commerce Control List (CCL) мы убеждены,
что об основном общественном достоянии, исходный код SQLite не описан никаким
ECCN, следовательно ECCN, нужно сообщить как EAR99.
Если колонки вашего набора результатов имеют
пункты AS, то SQLite, как гарантируют, будет использовать идентификатор
направо от ключевого слова AS как имя столбца.
Если набор результатов не использует пункт AS, то SQLite свободен назвать
колонку как хочет. Посмотрите
sqlite3_column_name().
Если не открыто с флагами, чтобы предотвратить это,
база данных SQLite создается, если это еще не существует.
Недавно созданные базы данных первоначально пусты. Это может смутить людей,
которые непреднамеренно открывают различные файлы базы данных в различных
контекстах из-за опечатки в имени файла или из-за использования
относительного пути, который используется с отличающимися текущими каталогами
для вводных процессов.