Гибкие типы данных в SQLite
Люди часто не понимают, что за ерунда происходит в SQLite с типами данных. Давайте разберемся.
SQLite использует пять типов:
INTEGER
— целые числа,REAL
— действительные числа,TEXT
— строки,BLOB
— бинарные данные,NULL
— пустое значение.
Пока ничего необычного (только типов маловато по сравнению с другими СУБД).
А как вам такое:
SQLite может хранить данные любого типа — вне зависимости от того, какой тип указан на столбце.
Хотите записать число 3.14
в integer-поле? Пожалуйста (и никакого округления). Или, может быть, 'привет'
в поле типа real? Без проблем.
Дело в том, что SQLite хранит тип не только на столбце, но и на каждом значении в таблице. Именно поэтому в одном столбце без проблем хранятся значения разных типов. Тип на столбце используется как рекомендация: при вставке SQLite пытается привести значение к рекомендуемому типу, но если не получилось — сохраняет «как есть».
Это удобно для анализа данных — можно сначала все загрузить, а потом средствами SQL разбираться с проблемными значениями. Любая другая СУБД выдаст ошибку при импорте и заставит вас «шерстить» файл скриптами или вручную.
С другой стороны, это неожиданное поведение, за которое многие недолюбливают SQLite и даже прозвали его «JavaScript в мире баз данных». Со временем разработчики SQLite прислушались и сделали альтернативный механизм «строгих» таблиц — но о нем в другой раз.
★ Подписывайтесь на новые заметки.