При составлении таблицы в SQLite3 я запутываюсь, сталкиваясь со всеми возможными типами данных, которые подразумевают подобное содержание, таким образом, кто-либо мог сказать мне различие между следующими типами данных?
INT, INTEGER, SMALLINT, TINYINT
DEC, DECIMAL
LONGCHAR, LONGVARCHAR
DATETIME, SMALLDATETIME
Есть ли некоторая документация где-нибудь, которая перечисляет минимальные/максимум мощности различных типов данных? Например, я предполагаю smallint
содержит большее максимальное значение, чем tinyint
, но меньшее значение, чем целое число, но я понятия не имею о том, каковы эти мощности.
SQLite
технически не имеет типов данных, в системе манифестной типизации есть классов хранения , и да, это сбивает с толку, если вы привыкли к традиционным РСУБД
es. Все внутри хранится в виде текста.Типы данных приводятся / преобразуются в различные места хранения на основе сходства (как типы данных, назначаемые столбцам).
Лучшее, что я рекомендую вам сделать, это:
Временно забыть все, что вы знали о типах данных автономной базы данных
Прочтите приведенную выше ссылку с сайта SQLite
.
Возьмите типы, основанные на вашей старой схеме, и посмотрите, что они будут отображать в SQLite
Перенесите все данные в базу данных SQLite
.
Примечание: Ограничения типа данных могут быть обременительными, особенно если вы добавляете временные интервалы, даты или подобные вещи в SQL
. SQLite
имеет очень мало встроенных функций для такого рода вещей. Однако SQLite
действительно предоставляет вам простой способ создания ваших собственных встроенных функций для добавления временных интервалов и прочего подобного с помощью библиотечной функции sqlite3_create_function
. Вы бы использовали это средство вместо традиционных хранимых процедур.
Большинство из них предназначены для совместимости. На самом деле у вас есть только целые числа, числа с плавающей запятой, текст и капли. Даты могут храниться как число (время unix - целое число, время microsoft - плавающее) или как текст.
Разница - синтаксический сахар. Только несколько подстрок имен типов имеют значение в отношении родства типов.
Правила определения родства перечислены на сайте SQLite.
Если вы настаиваете на строгой типизации, вы можете реализовать ее с помощью CHECK
ограничений:
CREATE TABLE T (
N INTEGER CHECK(TYPEOF(N) = 'integer'),
Str TEXT CHECK(TYPEOF(Str) = 'text'),
Dt DATETIME CHECK(JULIANDAY(Dt) IS NOT NULL)
);
Но я никогда не заморачиваюсь с этим.
Что касается разрядности каждого типа:
INTEGER
всегда является знаковым 64-битным. Обратите внимание, что SQLite оптимизирует хранение маленьких целых чисел за кадром, так что TINYINT в любом случае не пригодится. REAL
всегда 64-битное (double
). TEXT
и BLOB
имеют максимальный размер, определяемый макросом препроцессора, который по умолчанию равен 1,000,000,000 байт.