Автор статьи считает, что SQLite — отличная база, но её гибкость с типами данных часто приводит к багам. И решение есть: STRICT-таблицы. Это фича, которая появилась в SQLite версии 3.37.0 (ноябрь 2021) и почему-то остаётся недооценённой.
Достаточно добавить слово STRICT в конец определения таблицы — и база начинает работать как "нормальная" SQL. Больше нельзя записать текст в столбец INTEGER. Попытка вставить 'garbage' в колонку age вызовет ошибку. Правда, если значение можно без потерь преобразовать (например, строка '123'), SQLite всё равно его пропустит — это удобно.
Второй плюс — STRICT блокирует создание таблиц с невалидными типами. Без строгого режима вы можете написать CREATE TABLE t (name GARBAGE), и это сработает. С STRICT такая опечатка вызовет ошибку. Разрешены только INT, INTEGER, REAL, TEXT, BLOB и ANY. При этом тип столбца становится обязательным — CREATE TABLE t (name) без типа больше не пройдёт.
Но есть и компромисс. Если гибкость всё-таки нужна, используйте тип ANY — он разрешает что угодно даже в строгой таблице. Минусов, впрочем, тоже хватает. Главный — нельзя сделать существующую таблицу строгой через ALTER TABLE. Придётся создавать новую, копировать данные и переименовывать. Если в старой таблице были "мусорные" значения (текст в числовом столбце), миграция упадёт с ошибкой — данные придётся чистить вручную.
Автор честно предупреждает: разработчики SQLite с ним не согласны. У них есть целая страница "The Advantages Of Flexible Typing". Они рекомендуют нестрогие таблицы для key-value хранилищ или импорта грязных CSV. Но автор всё равно на стороне строгих типов — слишком много раз ловил баги из-за неожиданного типа данных. На производительности STRICT не сказалось: тест со вставкой миллионов строк в таблицу из 100 колонок не показал разницы. Так что, резюмирует автор, это простой способ повысить качество кода — если, конечно, у вас актуальная версия SQLite.