Hôm nay tụi mình sẽ nói về kiểu dữ liệu số trong PostgreSQL nha. Nếu bạn từng thắc mắc làm sao lưu số "42", tính toán tài chính hay thậm chí là mili giây, thì bạn đến đúng chỗ rồi đó. Cùng tìm hiểu xem kiểu nào hợp cho từng trường hợp để bạn và dữ liệu của bạn đều "chill" nhé.
Kiểu dữ liệu số trong PostgreSQL chia thành ba nhóm chính:
- Số nguyên (
INTEGER): để lưu số không có phần thập phân. Kiểu như 1, 42, -7 ấy mà. - Số chính xác (
NUMERIC): để lưu số có số lượng chữ số sau dấu phẩy cố định. Cực kỳ hữu ích cho tính toán tài chính, nơi độ chính xác còn quan trọng hơn cả cuộc sống. - Số thực dấu phẩy động (
REAL): để lưu số có thể rất lớn hoặc siêu nhỏ. Độ chính xác kém hơnNUMERIC, nhưng lại hợp cho tính toán khoa học.
Kiểu INTEGER
INTEGER là kiểu dữ liệu cho số nguyên. Dùng khi bạn cần lưu số không có phần thập phân. PostgreSQL có tận ba loại INTEGER để phù hợp với các khoảng giá trị khác nhau:
SMALLINT: kiểu số nguyên nhỏ. Khoảng: từ -32,768 đến 32,767.INTEGER(hoặcINT): kiểu số nguyên tiêu chuẩn. Khoảng: từ -2,147,483,648 đến 2,147,483,647.BIGINT: cho số siêu lớn. Khoảng: từ -9,223,372,036,854,775,808 đến 9,223,372,036,854,775,807.
Giả sử tụi mình có bảng students lưu thông tin sinh viên: tên, tuổi và số tín chỉ đã đạt được:
| id | name | age | credits |
|---|---|---|---|
| 1 | Otto Nate | 21 | 30 |
| 2 | Maria Chi | 22 | 45 |
| 3 | Peter Val | 20 | 60 |
| 4 | Anna Song | 23 | 50 |
| 5 | Sophie Zhang | 21 | 35 |
Giờ chạy thử một câu SQL đơn giản để lấy danh sách sinh viên với tuổi và số tín chỉ nhé:
SELECT name, age, credits
FROM students;
Kết quả:
| name | age | credits |
|---|---|---|
| Otto Nate | 21 | 30 |
| Maria Chi | 22 | 45 |
| Peter Val | 20 | 60 |
| Anna Song | 23 | 50 |
| Sophie Zhang | 21 | 35 |
Khi nào dùng INTEGER?
- Lưu id (
id, số đơn hàng). - Lưu số lượng gì đó (ví dụ số hàng trong kho, số sinh viên).
Kiểu NUMERIC
NUMERIC là kiểu dữ liệu cho số chính xác với dấu phẩy cố định. Nếu bạn cần lưu kiểu như 123.456, và sai một số sau dấu phẩy là "toang" (mất uy tín hoặc tiền), thì dùng NUMERIC nha.
Cú pháp khai báo: NUMERIC(precision, scale), trong đó:
precision— tổng số chữ số (bao gồm cả trước và sau dấu phẩy).scale— số chữ số sau dấu phẩy.
Ví dụ, NUMERIC(6, 2) cho phép lưu số tối đa 6 chữ số, trong đó 2 chữ số sau dấu phẩy.
Tạo bảng lưu giao dịch tài chính nè:
| id | description | amount |
|---|---|---|
| 1 | Thanh toán học phí | 2345.67 |
| 2 | Học bổng hàng tháng | 500.00 |
| 3 | Phí phòng lab | 145.99 |
| 4 | Phạt thư viện | 12.75 |
| 5 | Đăng ký hội thảo | 320.50 |
Giờ in danh sách giao dịch ra nhé:
SELECT description, amount
FROM transactions;
Kết quả:
| description | amount |
|---|---|
| Thanh toán học phí | 2345.67 |
| Học bổng hàng tháng | 500.00 |
| Phí phòng lab | 145.99 |
| Phạt thư viện | 12.75 |
| Đăng ký hội thảo | 320.50 |
Khi nào dùng NUMERIC?
- Tính toán tài chính (giá hàng hóa, lương...)
- Lưu các phép đo chính xác (cân nặng, chiều dài...)
Bảng measurements
| id | mass - REAL | height - REAL |
|---|---|---|
| 1 | 70.5 | 1.83 |
| 2 | 64.2 | 1.75 |
| 3 | 82.3 | 1.92 |
| 4 | 55.0 | 1.60 |
Giờ in giá trị ra nhé:
SELECT mass, height
FROM measurements;
Kết quả:
| mass | height |
|---|---|
| 70.5 | 1.83 |
| 64.2 | 1.75 |
| 82.3 | 1.92 |
| 55.0 | 1.60 |
Khi nào dùng REAL?
- Tính toán khoa học (khối lượng nguyên tử, khoảng cách tới Mặt Trăng...)
- Mô phỏng dữ liệu, nơi sai số là chấp nhận được.
So sánh các kiểu số: dùng khi nào?
| Kiểu dữ liệu | Khoảng giá trị | Độ chính xác | Ví dụ ứng dụng |
|---|---|---|---|
SMALLINT |
-32,768 đến 32,767 | Số nguyên | Số nhỏ (tuổi, điểm đánh giá...) |
INTEGER |
-2,147,483,648 đến 2,147,483,647 | Số nguyên | Id, số lượng... |
BIGINT |
-9,223,372,036,854,775,808 đến 9,223,372,036,854,775,807 | Số nguyên | Số siêu lớn. |
NUMERIC |
Phụ thuộc precision và scale |
Số thập phân chính xác | Tài chính, đo lường. |
REAL |
Khoảng 6 chữ số thập phân | Dấu phẩy động | Dữ liệu xấp xỉ hoặc khoa học. |
DOUBLE PRECISION |
Khoảng 15 chữ số thập phân | Dấu phẩy động chính xác cao | Khoa học, nghiên cứu. |
Bí danh (alias)
Trong PostgreSQL, nhiều kiểu số có bí danh (alias) — là tên thay thế cho kiểu, giúp code dễ đọc hơn hoặc tương thích với các hệ quản trị khác.
Dưới đây là hướng dẫn ngắn gọn về alias kiểu số trong PostgreSQL:
Alias cho kiểu số nguyên
| Alias | Kiểu thật | Kích thước | Khoảng giá trị |
|---|---|---|---|
INT |
INTEGER |
4 byte | −2,147,483,648 đến 2,147,483,647 |
INT4 |
INTEGER |
4 byte | (alias cũ) |
SMALLINT |
SMALLINT |
2 byte | −32,768 đến 32,767 |
INT2 |
SMALLINT |
2 byte | |
BIGINT |
BIGINT |
8 byte | −9 quintillion đến +9 quintillion |
INT8 |
BIGINT |
8 byte |
Alias cho số chính xác
| Alias | Kiểu thật | Mục đích |
|---|---|---|
DEC |
NUMERIC |
Alias theo chuẩn SQL |
DECIMAL |
NUMERIC |
Giống hệt |
Alias cho số dấu phẩy động
| Alias | Kiểu thật | Độ chính xác |
|---|---|---|
FLOAT |
DOUBLE PRECISION |
~15 chữ số (mặc định) |
FLOAT(24) |
REAL |
~6 chữ số |
FLOAT(53) |
DOUBLE PRECISION |
~15 chữ số |
FLOAT8 |
DOUBLE PRECISION |
Alias cũ |
FLOAT4 |
REAL |
Alias cũ |
Lỗi thường gặp
Làm việc với kiểu số, bạn có thể gặp vài "bẫy" như sau:
Chọn kiểu dữ liệu không đủ. Nếu bạn dùng SMALLINT cho tuổi người, là sai đó. Robot trong "Matrix" mà tuổi hàng triệu năm thì buồn lắm luôn.
Mất dữ liệu khi làm tròn. Dùng REAL cho tính toán tài chính là mất tiền lẻ như chơi. Rồi mất luôn niềm tin khách hàng.
So sánh kiểu khác nhau. Nếu so INTEGER với REAL, có thể ra kết quả bất ngờ do cách số dấu phẩy động được lưu trữ.
GO TO FULL VERSION