타입을 눈감아 주는 기능
SQLite는 기본적으로 type affinity로 움직여. INTEGER 컬럼은 정수를 선호할 뿐이라 문자열도 받아주고, TEXT 컬럼은 숫자도 받아. 이건 실수가 아니라 의도야. 데이터 모양이 그때그때 달라지는 자리 — 예를 들면 오래된 CSV를 밀어넣는 자리 —에 SQLite를 끼워넣기 쉽게 하려고 그렇게 만든 거지.
affinity는 다섯 갈래로 나뉘어.
- INTEGER — 이름에 'INT'가 들어간 타입.
- TEXT — 이름에 'CHAR'나 'CLOB', 'TEXT'가 들어간 타입.
- BLOB — affinity가 아예 없는 경우야. 타입을 안 적었거나 'BLOB'이라고 적었을 때.
- REAL — 이름에 'REAL'이나 'FLOA', 'DOUB'가 들어간 타입.
- NUMERIC — 나머지 전부. 애매한 'NUMERIC' 자신도 여기 들어가.
affinity 규칙은 꽤 별나. 대개는 신경 안 쓰고 의도한 타입만 선언하면 돼. 그러다 이상한 일이 생기면 — SUM 결과가 문자열로 나오거나, 인덱스가 있어야 할 row를 놓치거나 — 답은 거의 항상 하나야. 엉뚱한 storage class를 가진 값이 끼어든 거지.
Warning: type affinity는 인덱스와 비교 동작에까지 손을 뻗어.
id가 TEXT affinity를 갖고 있으면 WHERE id = '42'와 WHERE id = 42가 서로 다르게 동작해. 해법은 다음 lesson의 STRICT 모드를 쓰거나, Python 쪽에서 타입을 조심해서 넘기는 거야.