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 удобным для разработки приложений, где строгая типизация может не быть приоритетом, но требует внимательного подхода для поддержания целостности и согласованности данных.