SQLiteの型の扱いは雑

一般的なリレーショナルデータベースであれば、カラムの型がレコードによって異なるなんてことはありませんが、SQLiteはその限りではありません。

整数型と宣言したカラムにテキスト型のレコードを格納できます。

これはバグではなくて仕様のため、SQLiteのデータ型のドキュメント冒頭で丁寧に解説されていますし(“Flexible typing is a feature of SQLite, not a bug.”)、”The Advantages Of Flexible Typing“というそのものズバリのドキュメントも存在します。

SQLite3で型に厳格なSTRICTテーブルを作る | DevelopersIO

そんなSQLiteにstrictオプションが登場

STRICT Tables provide a prescriptive style of data type management, for developers who prefer that kind of thing.

SQLite Release 3.37.0 On 2021-11-27

CREATE TABLEのときにSTRICTをつけると、そのテーブルに対しては型が厳密になるよう。

CREATE TABLE t1(a ANY) STRICT;

Rails v7.1からstrictオプションが利用可能

対応されたPRは下記。

Add :strict option to default SQLite database.yml template by fatkodima · Pull Request #45346 · rails/rails

database.yml に下記のstrict optionを追加すれば動くようだ。

development:
  adapter: sqlite3
  database: db/development.sqlite3
  ...
  strict: true

追記(2023-07-31)

config.active_record.strict_strings_by_default とあるように、Railsのstrict optionは STRICT Tables とは全く別物のようですね。