2024-12-11
테이블 생성
CREATE TABLE t ( c1 bigint, c2 int8 );
- 여기서 c1은 BIGINT로 정의되고, c2는 INT8로 정의됩니다.
- 이 두 타입은 동일한 데이터 타입을 참조하기 때문에 PostgreSQL은 둘을 같은 것으로 처리합니다.
속성 조회
SELECT a.attname, t.typname
FROM pg_class AS c
JOIN pg_attribute AS a ON a.attrelid = c.oid
JOIN pg_type AS t ON a.atttypid = t.oid
WHERE c.relname = 't' AND a.attname IN ('c1', 'c2') ORDER BY 1;
이 쿼리는 테이블 t의 각 컬럼 이름(attname)과 데이터 타입 이름(typname)을 가져옵니다.
c1 | int8 |
c2 | int8 |
- c1과 c2 모두 int8로 반환됩니다.
- 이는 BIGINT와 INT8이 동일한 데이터 타입을 나타낸다는 것을 보여줍니다.
타입 정의 조회
SELECT * FROM pg_type WHERE typname IN ('int8', 'bigint');
결과는 다음과 같습니다
int8 |
- pg_type 시스템 카탈로그에는 typname으로 int8만 정의되어 있습니다.
- PostgreSQL 내부적으로 BIGINT는 실제 데이터 타입이 아니라 INT8의 별칭으로 처리되므로, pg_type에 BIGINT라는 이름이 나타나지 않습니다.
PostgreSQL 내부 구조 이해
pg_type 카탈로그
- pg_type은 PostgreSQL 데이터베이스의 데이터 타입 정의를 관리하는 시스템 카탈로그입니다.
- BIGINT는 SQL 표준에 따라 사용자를 위해 정의된 이름이며, 내부적으로는 INT8로 매핑됩니다.
데이터 타입 처리 흐름
- 테이블 생성 시 BIGINT는 SQL 구문으로 전달됩니다.
- PostgreSQL은 이를 INT8로 변환하여 pg_type에 저장합니다.
- 테이블 생성 후, 데이터 타입 정보는 항상 INT8로 나타납니다.
실무적 의미
- BIGINT와 INT8은 동일한 데이터 타입으로 취급되며, 두 이름을 혼용해도 동작에 차이가 없습니다.
- PostgreSQL에서 BIGINT는 SQL 표준을 준수하려는 사용자 친화적 표현일 뿐, 내부적으로는 INT8로 동작합니다.
- pg_type에서 BIGINT라는 이름을 찾을 수 없는 이유는 PostgreSQL이 이를 별칭(alias)로 처리하기 때문입니다.
결론
- BIGINT와 INT8은 PostgreSQL에서 동일한 데이터 타입입니다.
- pg_type 카탈로그에는 BIGINT가 별도로 저장되지 않으며, 모든 BIGINT 타입은 INT8로 저장됩니다.
- pg_type 쿼리 결과는 PostgreSQL의 데이터 타입 처리 방식을 올바르게 반영하고 있습니다.
이로 인해 성능이나 동작에는 차이가 없으며, BIGINT를 사용하는 것은 SQL 표준 준수와 가독성을 위한 선택일 뿐입니다.
출처 : https://stackoverflow.com/questions/68200397/whats-the-difference-between-bigint-and-int8-postgres
메인 이미지 출처 : 사진: Unsplash의Steve Johnson