Чем отличаются связанные типы данных SQLite, такие как INT, INTEGER, SMALLINT и TINYINT? - PullRequest
99 голосов
/ 04 мая 2010

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

INT, INTEGER, SMALLINT, TINYINT

DEC, DECIMAL

LONGCHAR, LONGVARCHAR

DATETIME, SMALLDATETIME

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

Ответы [ 5 ]

92 голосов
/ 04 мая 2010

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

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

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

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

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

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

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

46 голосов
/ 04 мая 2010

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

  • Сродство 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 байт.
10 голосов
/ 04 мая 2010

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

3 голосов
/ 17 мая 2013

NULL. Значение равно NULL.

INTEGER. Значение представляет собой целое число со знаком, сохраняемое в 1, 2, 3, 4, 6 или 8 байтах в зависимости от величины значения.

REAL. Значение является значением с плавающей запятой, которое хранится как 8-байтовое число с плавающей запятой IEEE.

TEXT. Значением является текстовая строка, которая хранится в кодировке базы данных (UTF-8, UTF-16BE или UTF-16LE).

BLOB. Значение представляет собой блок данных, сохраняемый в точности так, как он был введен.

1 голос
/ 12 сентября 2015

В качестве дополнения к ответу от dan04, если вы хотите вслепую вставить NUMERIC, отличное от нуля, представленного TEXT, но убедитесь, что текст конвертируется в число:

your_numeric_col NUMERIC CHECK(abs(your_numeric_col) <> 0)

Типичный вариант использования в запросе от программы, которая обрабатывает все данные как текст (для единообразия и простоты, поскольку SQLite уже делает это). Хорошая вещь об этом - то, что это позволяет конструкции как это:

INSERT INTO table (..., your_numeric_column, ...) VALUES (..., some_string, ...)

, что удобно, если вы используете заполнители, потому что вам не нужно специально обрабатывать такие ненулевые числовые поля. Пример использования модуля sqlite3 в Python:

conn_or_cursor.execute(
    "INSERT INTO table VALUES (" + ",".join("?" * num_values) + ")",   
    str_value_tuple)  # no need to convert some from str to int/float

В приведенном выше примере все значения в str_value_tuple будут экранированы и заключены в кавычки как строки при передаче в SQlite. Однако, поскольку мы не проверяем тип явно с помощью TYPEOF, а только конвертируемость в тип , он все равно будет работать как нужно (т. Е. SQLite сохранит его как числовой или выйдет из строя иначе). 1019 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...