PostgreSQL의 VARCHAR에서 실제 바이트 수
PostgreSQL에서 흔히 사용하는 데이터 타입인 VARCHAR(n)은 일반적으로 "최대 문자 수"로 인식된다. 즉, VARCHAR(10)이라면 최대 10개의 문자를 저장할 수 있다. 여기서 주의할 점은, 이는 바이트(byte) 수가 아니라 문자(character) 수를 기준으로 한다는 것이다.
PostgreSQL의 기본 인코딩은 UTF-8이며, 이는 한 문자가 여러 바이트로 구성될 수 있는 멀티바이트(multi-byte) 인코딩이다.
예를 들어, 한글은 일반적으로 한 글자당 3바이트로 구성된다. 따라서 VARCHAR(10)으로 선언된 컬럼에 한글 10자를 저장하면 실제로는 최대 30바이트를 차지하게 된다.
Oracle과는 조금 다르다. Oracle의 경우 VARCHAR2(10 BYTE)와 같이 바이트 단위로 최대 길이를 관리하는 옵션을 제공하지만, PostgreSQL은 기본적으로 문자의 개수만 관리한다. 이 차이점으로 인해 실제 데이터 저장 시 예상하지 못한 바이트 수 차이가 발생할 수 있다.
PostgreSQL 공식 문서에도 다음과 같은 내용이 있다.
“데이터베이스 인코딩을 변경하면, 각 문자에 할당되는 바이트 수가 달라지므로, VARCHAR의 최대 길이 계산도 바뀐다.”
— PostgreSQL Documentation, Character Types
결국, PostgreSQL에서 테이블 설계 시 VARCHAR(n)을 사용할 때는 데이터베이스의 인코딩 방식을 고려해야 한다. 특히 UTF-8과 같은 멀티바이트 환경에서는 문자 개수와 실제 바이트 수 사이의 차이를 명확히 이해하고, 데이터 길이를 설계할 때 충분히 주의할 필요가 있다.
핵심 정리
- PostgreSQL의 VARCHAR(n)에서 n은 문자 수를 기준으로 한다.
- UTF-8 인코딩 환경에서는 실제 저장되는 바이트 수가 문자당 최대 4바이트(일반적인 한글은 3바이트)가 될 수 있다.
- 따라서 멀티바이트 환경에서는 저장할 데이터의 문자 종류와 길이를 정확히 고려하여 컬럼 크기를 결정해야 한다.