'타입 거짓말' 기능
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 쪽에서 신경 써서 타이핑.