C.W.K.
Stream
Lesson 02 of 10 · published

Type Affinity — SQLite 의 유연한 타이핑

~14 min · schema, type-affinity, typing

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

'타입 거짓말' 기능

SQLite 는 기본값으로 type affinity 사용. INTEGER 컬럼은 integer 저장을 선호 하지만 string 도 받아. TEXT 컬럼은 숫자도 받아. 이건 의도된 거 — 데이터 모양이 유동적인 자리 (legacy CSV import 같은) 에 SQLite 를 embed 하기 쉽게 하려고.

5 가지 affinity 클래스:

  • INTEGER — 'INT' 들어간 타입.
  • TEXT — 'CHAR', 'CLOB', 'TEXT' 들어간 타입.
  • BLOB — affinity 없음 (타입 미지정 또는 'BLOB').
  • REAL — 'REAL', 'FLOA', 'DOUB' 들어간 타입.
  • NUMERIC — 그 외 (모호한 'NUMERIC' 자체 포함).

Affinity 룰은 quirky. 대부분 무시하고 의도한 거 선언하면 돼. 근데 surprise 생기면 — SUM 결과가 string 으로 오거나, 인덱스가 row 놓치거나 — 답은 거의 항상 '잘못된 storage class 의 값이 끼어들었다'.

Warning: Type affinity 가 인덱스 + 비교 동작에도 영향. id 가 TEXT affinity 면 WHERE id = '42'WHERE id = 42 가 다르게 동작. 해법은 STRICT 모드 (다음 lesson) 또는 Python 쪽에서 신경 써서 타이핑.

Code

Affinity 실제 — 같은 컬럼, 다른 storage class·sql
CREATE TABLE demo (val INTEGER);
INSERT INTO demo(val) VALUES (1);     -- integer 로 저장
INSERT INTO demo(val) VALUES ('two'); -- text 로 저장 — SQLite 받아줌!
INSERT INTO demo(val) VALUES (3.14);  -- real 로 저장

SELECT val, typeof(val) FROM demo;
-- 1   | integer
-- two | text
-- 3.14| real
Affinity surprise 방어·sql
-- Option 1: CHECK 제약
CREATE TABLE strict_int (
  v INTEGER NOT NULL CHECK (typeof(v) = 'integer')
);

INSERT INTO strict_int(v) VALUES ('hi');
-- Error: CHECK constraint failed: typeof(v) = 'integer'

-- Option 2: STRICT 테이블 (3.37+) — 다음 lesson
CREATE TABLE really_strict (v INTEGER NOT NULL) STRICT;

External links

Exercise

작은 demo 테이블 만들고 컬럼에 타입 잘못된 값 넣어봐. SELECT 의 typeof(col) 으로 SQLite 가 어떤 storage class 골랐는지 확인. CHECK 제약 추가해서 잘못된 타입 거부, 재테스트, 에러 관찰. type affinity 가 언제 쓸모 있고 언제 사고인지 설명.

Progress

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

댓글 0

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

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