본문 바로가기
C.W.K.
Stream
Lesson 03 of 10 · published

STRICT 테이블 (3.37+)

~12 min · schema, strict, types

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

골라서 켜는 진짜 타입 검사

2021년 11월에 나온 SQLite 3.37이 STRICT 테이블을 들고 왔어. CREATE TABLE 끝에 STRICT만 붙이면 SQLite가 선언한 타입에 안 맞는 insert를 거부해. 2026년에 새로 schema를 짠다면 이게 기본이어야 해.

STRICT 모드가 받아주는 타입은 다섯 개뿐이야. INTEGER, REAL, TEXT, BLOB, ANY. VARCHAR(255) 같은 느슨한 affinity 이름은 테이블을 만드는 순간에 거부당해. STRICT는 schema가 거짓말을 못 하게 만들어.

Tip: 2026년에 새 schema를 시작한다면 모든 테이블에 STRICT를 기본으로 깔아. 타입이 헐렁한 '기능'은 2000년대 초 embedded C 시절에 일부러 택한 타협이었어. 요즘 앱 코드는 DB가 계약을 대신 지켜주기를 원해.

한 가지 걸리는 게 있어. STRICT 테이블은 모든 컬럼 타입이 저 다섯 안에 들어와야 해. 그래서 기존 schema를 옮기려면 VARCHARNUMERIC 같은 걸 strict 타입으로 다시 써야 하지. ANY는 진짜로 여러 타입을 담아야 하는 컬럼을 위한 탈출구야. key-value 테이블의 value 컬럼 같은 자리 말이야.

Code

STRICT 실전·sql
CREATE TABLE notes (
  id   INTEGER PRIMARY KEY,
  body TEXT NOT NULL,
  tags TEXT,                -- JSON array, SQL 입장에선 opaque
  created_at TEXT NOT NULL DEFAULT (datetime('now'))
) STRICT;

INSERT INTO notes(body) VALUES (42);
-- Error: cannot store INTEGER value in TEXT column body

INSERT INTO notes(body) VALUES ('hello');
-- OK
Polymorphic 컬럼용 STRICT + ANY·sql
CREATE TABLE settings (
  k TEXT PRIMARY KEY,
  v ANY
) STRICT;

INSERT INTO settings(k, v) VALUES ('theme', 'dark');
INSERT INTO settings(k, v) VALUES ('font_size', 14);
INSERT INTO settings(k, v) VALUES ('debug', 1);

SELECT k, v, typeof(v) FROM settings;
-- theme    | dark | text
-- font_size| 14   | integer
-- debug    | 1    | integer

External links

Exercise

s01에서 만든 messages 테이블을 STRICT로 다시 써봐. 먼저 네 머신의 SQLite가 3.37 이상인지 확인하고. 그다음 insert를 세 번 시도해. 멀쩡한 값, 타입이 틀린 값, NOT NULL 자리에 NULL. SQLite가 잘못된 걸 분명한 에러로 밀어내는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.