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ộ đếmbigint(int8): ~±9,2 tỷ tỷ — dùng cho khoá chính bảng dự kiến lớn, tránh cạn IDsmallint: ±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.