Каково различие между связанными типами данных SQLite как INT, ЦЕЛОЕ ЧИСЛО, SMALLINT и TINYINT?

При составлении таблицы в SQLite3 я запутываюсь, сталкиваясь со всеми возможными типами данных, которые подразумевают подобное содержание, таким образом, кто-либо мог сказать мне различие между следующими типами данных?

INT, INTEGER, SMALLINT, TINYINT

DEC, DECIMAL

LONGCHAR, LONGVARCHAR

DATETIME, SMALLDATETIME

Есть ли некоторая документация где-нибудь, которая перечисляет минимальные/максимум мощности различных типов данных? Например, я предполагаю smallint содержит большее максимальное значение, чем tinyint, но меньшее значение, чем целое число, но я понятия не имею о том, каковы эти мощности.

99
задан Ciro Santilli 新疆改造中心法轮功六四事件 20 November 2015 в 20:20
поделиться

3 ответа

SQLite технически не имеет типов данных, в системе манифестной типизации есть классов хранения , и да, это сбивает с толку, если вы привыкли к традиционным РСУБД es. Все внутри хранится в виде текста.Типы данных приводятся / преобразуются в различные места хранения на основе сходства (как типы данных, назначаемые столбцам).

Лучшее, что я рекомендую вам сделать, это:

  1. Временно забыть все, что вы знали о типах данных автономной базы данных

  2. Прочтите приведенную выше ссылку с сайта SQLite .

  3. Возьмите типы, основанные на вашей старой схеме, и посмотрите, что они будут отображать в SQLite

  4. Перенесите все данные в базу данных SQLite .

Примечание: Ограничения типа данных могут быть обременительными, особенно если вы добавляете временные интервалы, даты или подобные вещи в SQL . SQLite имеет очень мало встроенных функций для такого рода вещей. Однако SQLite действительно предоставляет вам простой способ создания ваших собственных встроенных функций для добавления временных интервалов и прочего подобного с помощью библиотечной функции sqlite3_create_function . Вы бы использовали это средство вместо традиционных хранимых процедур.

93
ответ дан 24 November 2019 в 05:05
поделиться

Большинство из них предназначены для совместимости. На самом деле у вас есть только целые числа, числа с плавающей запятой, текст и капли. Даты могут храниться как число (время unix - целое число, время microsoft - плавающее) или как текст.

10
ответ дан 24 November 2019 в 05:05
поделиться

Разница - синтаксический сахар. Только несколько подстрок имен типов имеют значение в отношении родства типов.

  • INT, INTEGER, SMALLINT, TINYINT → сродство INTEGER, потому что все они содержат "INT".
  • LONGCHAR, LONGVARCHAR → сродство к TEXT, потому что они содержат "CHAR".
  • DEC, DECIMAL, DATETIME, SMALLDATETIME → NUMERIC, потому что они не содержат ни одной из подстрок, которые имеют значение.

Правила определения родства перечислены на сайте 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 байт.
46
ответ дан 24 November 2019 в 05:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: