{
  "status": "shipping",
  "advantages": [],
  "limitations": [],
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": null,
  "lastSeen": null,
  "updated": "2026-10-20",
  "slug": "sqlite-strict-table",
  "term": "SQLite STRICT table",
  "aliases": [
    "STRICT typing"
  ],
  "definition": "A SQLite STRICT table enforces a restricted set of column types after permitted coercions, while its ANY columns preserve the received value and type without coercion.",
  "note": "STRICT is a per-table option available since SQLite 3.37.0. Ordinary ANY can convert numeric-looking text; STRICT ANY does not. Preservation concerns the value actually bound, not earlier source data. [strict]\n\nOn SQLite 3.45.1, a controlled decimal-point text input lost one unit when inserted into STRICT INTEGER. Text bound into STRICT ANY remained text, but a Python float already rounded before binding remained rounded. Exact numeric equality with the source must be tested separately from type validity. [experiment]",
  "related": [
    "sqlite-type-affinity",
    "sqlite-integrity-check",
    "backup-verification"
  ],
  "citations": [
    {
      "id": "strict",
      "title": "SQLite: STRICT Tables, sections 2 and 3",
      "url": "https://www.sqlite.org/stricttables.html",
      "accessed": "2026-10-20"
    },
    {
      "id": "experiment",
      "title": "Hesela: exact source values and STRICT import controls",
      "url": "https://hesela.com/analyses/sqlite-import-numeric-precision/#conversion",
      "accessed": "2026-10-20"
    }
  ],
  "provenance": [
    "Primary-source definition and controlled Python 3.12.3 / SQLite 3.45.1 observations. No claim that all engine versions were tested."
  ]
}
