← Tất cả bài viết

Chọn kiểu dữ liệu số trong PostgreSQL: int, bigint, numeric, real

22/07/2026

PostgreSQL có nhiều kiểu số và chọn đúng ngay từ đầu quan trọng, vì đổi kiểu cột trên bảng lớn về sau rất tốn kém. Bài này tóm tắt khi nào dùng cái nào.

Số nguyên: integer vs bigint

  • integer (int4): phạm vi ~±2,1 tỷ — đủ cho hầu hết bộ đếm
  • bigint (int8): ~±9,2 tỷ tỷ — dùng cho khoá chính bảng dự kiến lớn, tránh cạn ID
  • smallint: ±32767 — tiết kiệm cho cờ, mã trạng thái nhỏ

Với khoá tự tăng, bigserial/GENERATED ALWAYS AS IDENTITY kiểu bigint là lựa chọn an toàn mặc định.

Tiền tệ: DÙNG numeric, KHÔNG dùng float

Đây là quy tắc bất di bất dịch. real/double precision là số dấu phẩy động nhị phân — không biểu diễn chính xác 0.1, gây sai số tích luỹ. Dùng numeric(precision, scale) cho tiền, ví dụ numeric(12,2).

-- SAI: sai số
SELECT 0.1::float + 0.2::float;   -- 0.30000000000000004

-- ĐÚNG: chính xác
SELECT 0.1::numeric + 0.2::numeric; -- 0.3

Đánh đổi hiệu năng

numeric chính xác nhưng tính toán chậm hơn số nguyên/float vì lưu dạng thập phân. Với phép tính khoa học chấp nhận sai số nhỏ (toạ độ, thống kê) thì double precision nhanh hơn nhiều và hợp lý.

👉 Dùng thử công cụ liên quan trên dev-hub: SQL Formatter — chạy hoàn toàn trong trình duyệt, không gửi dữ liệu lên server.