PostgreSQL은 강력하고 표준을 잘 따르는 데이터베이스입니다.
하지만 의외의 작은 함정들도 있죠.

그중 하나는 바로 boolean 값을 다루는 방식, 특히 데이터를 텍스트 형식으로 내보낼 때의 이야기입니다.

🧠 PostgreSQL의 Boolean 처리 방식: 생각과 다르다

PostgreSQL은 boolean 값을 내부적으로 1비트(bit) 만으로 효율적으로 저장합니다. 예상한 대로죠.

하지만 그 값을 텍스트로 변환하거나 COPY 같은 방식으로 내보내면, 결과는 좀 다릅니다:

SELECT true::text;   -- 결과: 't'
SELECT false::text;  -- 결과: 'f'

맞습니다 — true't', false'f' 로 표현됩니다.

이건 PostgreSQL의 텍스트 I/O 기본 동작 방식인데, 이 동작 때문에 시스템 간 데이터를 주고받을 때 미묘한 버그가 생기기도 합니다.

🗂️ COPY & Export 이슈

COPY TO, psql, pg_dump 혹은 airflow, dbt, pandas 같은 도구를 쓸 때 PostgreSQL은 boolean 값을 't' / 'f' 형태로 내보냅니다 — true / false가 아닙니다!

예를 들어:

COPY my_table TO '/tmp/export.csv' CSV HEADER;

이렇게 내보내면 boolean 컬럼은 다음과 같이 나옵니다:

id,is_active
1,t
2,f

만약 이 데이터를 받는 도구가 true/false 또는 1/0을 기대하고 있다면… 결과는 혼돈의 카오스입니다. 🌀

🧪 요약: 저장 방식 vs 표현 방식

계층 PostgreSQL의 실제 동작
내부 저장소 1비트 (0 또는 1)
텍스트 캐스팅 't' / 'f'
COPY/psql export 't' / 'f'
CSV 파서 보통 true/false 또는 1/0을 기대함

💡 실무 팁

ETL 파이프라인 (dbt, pandas, Airflow 등)에서 't', 'f'를 발견했다면:

✅ 당황하지 마세요 — PostgreSQL에선 정상입니다 ✅ export/import 시 boolean 형식을 명시적으로 변환하세요 ✅ downstream 도구들이 어떤 형식을 기대하는지 문서화하세요

🧵 마무리

PostgreSQL은 정말 훌륭한 데이터베이스지만, MySQL, BigQuery, Pandas처럼 동작하진 않습니다.

Boolean 관련 이 작은 디테일 하나만 봐도 DB의 I/O 동작을 제대로 아는 것만으로도 디버깅 시간을 크게 줄일 수 있다는 것을 알 수 있죠.

“버그가 아니라, PostgreSQL은 그냥 PostgreSQL일 뿐.”