postgreSQL bigint vs int(8) 차이점

2024-12-11


사진: Unsplash 의 Steve Johnson


 

테이블 생성

 
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로 매핑됩니다.

데이터 타입 처리 흐름

  1. 테이블 생성 시 BIGINT는 SQL 구문으로 전달됩니다.
  2. PostgreSQL은 이를 INT8로 변환하여 pg_type에 저장합니다.
  3. 테이블 생성 후, 데이터 타입 정보는 항상 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

 

What's the difference between BIGINT and INT8? (postgres)

I'm using a service called Supabase and I created a table: CREATE TABLE my_table ( "id" BIGSERIAL PRIMARY KEY NOT NULL, "title" Text COLLATE "pg_catalog"."

stackoverflow.com

 

 


메인 이미지 출처 : 사진: UnsplashSteve Johnson