SQLite реализует подход к типам данных, называемый "динамическая типизация" (dynamic typing), который отличается от жёсткой типизации (strict typing) в других СУБД:
-
Типы данных не строго фиксированы:
- В SQLite тип данных столбца является рекомендацией. Это значит, что SQLite позволяет сохранить значение любого типа данных в любом столбце, независимо от его типа. Например, можно сохранить строку в столбце
INTEGER
, хотя другие СУБД (такие как MySQL или PostgreSQL) вызовут ошибку при попытке такого действия.
- SQLite проверяет тип данных только в определённых случаях, например, при использовании столбца как
PRIMARY KEY
.
-
Аффинити типов:
- SQLite использует систему аффинити типов (type affinity), чтобы определить, как данные должны быть преобразованы в нужный тип. Аффинити типов означает, что SQLite будет пытаться преобразовать данные в наиболее подходящий тип, указанный для столбца.
- Например, если столбец имеет тип
INTEGER
, а данные представляют собой строку, которая может быть преобразована в число, SQLite попытается сохранить её как INTEGER
.
- Существует несколько типов аффинити:
- INTEGER: Применяется, если в названии типа данных присутствует "INT".
- TEXT: Применяется, если в названии типа данных присутствует "CHAR", "CLOB" или "TEXT".
- REAL: Применяется, если в названии типа данных присутствует "REAL", "FLOA", "DOUB".
- NUMERIC: Используется, если тип данных не подходит под другие категории.
- NONE: Указывает, что данные сохраняются без приведения к типу (используется для
BLOB
).
-
Отсутствие специфичных типов данных:
- В отличие от других СУБД, SQLite не имеет отдельных типов данных, таких как
DATE
, TIME
, BOOLEAN
, VARCHAR(n)
.
- Даты и времена, как правило, сохраняются в формате
TEXT
(строка с датой) или INTEGER
(число, представляющее количество секунд с начала эпохи Unix).
- Логические значения (
TRUE
или FALSE
) обычно сохраняются как INTEGER
, где 0
представляет FALSE
, а 1
представляет TRUE
.
Примеры создания таблицы с различными типами данных и аффинити
CREATE TABLE sample_data (
id INTEGER PRIMARY KEY,
name TEXT, -- текстовая строка
price REAL, -- число с плавающей запятой
created_at TEXT, -- дата в текстовом формате
is_active INTEGER, -- логическое значение (0 = FALSE, 1 = TRUE)
image BLOB -- двоичные данные, например, изображение
);
В этой таблице:
id
— целое число с уникальными значениями.
name
— текстовое значение.
price
— число с плавающей запятой.
created_at
— текстовое представление даты.
is_active
— логическое значение, сохранённое как целое число.
image
— двоичные данные (например, изображение).
Заключение
Типы данных в SQLite, такие как INTEGER
, TEXT
, REAL
, и BLOB
, представляют собой базовые структуры для хранения данных. SQLite использует уникальный подход к типам данных благодаря аффинити и динамической типизации, что позволяет сохранять данные более гибко, чем в других СУБД. Это делает SQLite удобным для разработки приложений, где строгая типизация может не быть приоритетом, но требует внимательного подхода для поддержания целостности и согласованности данных.