При создании таблицы в SQLite3 я запутываюсь, когда сталкиваюсь со всеми возможными типами данных, которые подразумевают похожее содержимое, так может ли кто-нибудь сказать мне разницу между следующими типами данных?
INT, INTEGER, SMALLINT, TINYINT
DEC, DECIMAL
LONGCHAR, LONGVARCHAR
DATETIME, SMALLDATETIME
Есть ли где-нибудь документация, в которой перечислены мин. / Макс. возможности различных типов данных? Например, я предполагаю, что smallint
имеет большее максимальное значение tinyint
, чем целое, но меньшее, чем целое число, но я понятия не имею, каковы эти возможности.
DATE
илиBOOLEAN
, но я бы не стал различать разные размеры целых чисел. Это особенно верно для случаяINTEGER PRIMARY KEY
, когда точное имя типа имеет значение.Разница в синтаксическом сахаре. Лишь несколько подстрок имен типов имеют значение с точки зрения сходства типов.
Правила определения близости перечислены на сайте SQLite .
Если вы настаиваете на строгой типизации, вы можете реализовать это с
CHECK
ограничениями:Но я никогда не заморачивался с этим.
По вместимости каждого типа:
INTEGER
всегда подписан 64-битным. Обратите внимание, что SQLite оптимизирует хранение небольших целых чисел за кадром, поэтому TINYINT в любом случае не будет полезен.REAL
всегда 64-битный (double
).TEXT
иBLOB
имеют максимальный размер, определяемый макросом препроцессора, который по умолчанию равен 1 000 000 000 байт.источник
TYPEOF
. Таким образом, попытки вставить ТЕКСТ, который в противном случае был бы преобразован в класс хранения NUMERIC / INTEGER с помощью SQlite (т. Е. Такое преобразование без потерь, согласно sqlite.org/datatype3.html#affinity ) потерпят неудачу. Другими словами, этот подход более строгий, чем специальный подход, когда значение вставляется, а затем каким-то волшебным образом проверяется класс хранилища, используемый для хранения этого значения SQLite. Чтобы узнать о более снисходительном подходе, см. Мой ответ ниже.Большинство из них предназначены для совместимости. На самом деле у вас есть только целые числа, числа с плавающей запятой, текст и blob. Даты могут храниться в виде числа (время unix - целое число, время microsoft - плавающее) или текста.
источник
NULL
. Это значение NULL.INTEGER
. Значение представляет собой целое число со знаком, хранящееся в 1, 2, 3, 4, 6 или 8 байтах в зависимости от величины значения.REAL
. Значение представляет собой значение с плавающей запятой, сохраненное как 8-байтовое число с плавающей запятой IEEE.TEXT
. Значение представляет собой текстовую строку, хранящуюся с использованием кодировки базы данных (UTF-8, UTF-16BE или UTF-16LE).BLOB
. Значение - это блок данных, хранящийся точно в том виде, в котором он был введен.источник
В качестве дополнения к ответу от dan04, если вы хотите вслепую вставить
NUMERIC
отличное от нуля, представленное a,TEXT
но убедитесь, что текст можно преобразовать в числовое:Типичный вариант использования - запрос от программы, которая обрабатывает все данные как текст (для единообразия и простоты, поскольку SQLite уже делает это). Приятно то, что он позволяет создавать такие конструкции:
что удобно, если вы используете заполнители, потому что вам не нужно специально обрабатывать такие ненулевые числовые поля. Пример использования
sqlite3
модуля Python:В приведенном выше примере все значения
str_value_tuple
будут экранированы и заключены в кавычки как строки при передаче в SQlite. Однако, поскольку мы не проверяем явно тип через,TYPEOF
а только конвертируемость в тип , он по-прежнему будет работать по желанию (т.е. SQLite либо сохранит его как числовое, либо не сработает).источник