Để lưu trữ số nguyên có dấu (bao gồm cả số âm) trong MySQL, bạn sử dụng các kiểu số nguyên có dấu (signed integer types): TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT. Mặc định các kiểu này đều là SIGNED (có dấu) nếu không chỉ định UNSIGNED.
Phạm vi lưu trữ của các kiểu số nguyên có dấu
| Kiểu | Kích thước (byte) | Phạm vi có dấu (SIGNED) |
|---|---|---|
| TINYINT | 1 | -128 đến 127 |
| SMALLINT | 2 | -32,768 đến 32,767 |
| MEDIUMINT | 3 | -8,388,608 đến 8,388,607 |
| INT | 4 | -2,147,483,648 đến 2,147,483,647 |
| BIGINT | 8 | -9,223,372,036,854,775,808 đến 9,223,372,036,854,775,807 |
Ví dụ dùng TINYINT cho số âm
mysql> CREATE TABLE DemoTable (Number TINYINT);
mysql> INSERT INTO DemoTable VALUES (-10), (-128), (127), (-1), (14);
-- Lưu ý: 128 sẽ lỗi Out of range vì TINYINT SIGNED max là 127
mysql> INSERT INTO DemoTable VALUES (128);
ERROR 1264 (22003): Out of range value for column 'Number' at row 1
Kết quả
mysql> SELECT * FROM DemoTable;
+--------+
| Number |
+--------+
| -10 |
| -128 |
| 127 |
| -1 |
| 14 |
+--------+
Lựa chọn kiểu phù hợp
- TINYINT: Cờ, trạng thái nhỏ, số lượng rất nhỏ (ví dụ: -10 đến 100).
- SMALLINT: Số lượng trung bình, điểm số, mã code nhỏ.
- INT: Mặc định cho khóa chính, số lượng lớn, ID.
- BIGINT: ID phân tán (UUID numeric), timestamp nanosecond, số tiền lớn (cents).
Lưu ý: Nếu chắc chắn chỉ lưu số không âm, thêm UNSIGNED để gấp đôi phạm vi dương (Ví dụ: TINYINT UNSIGNED: 0-255). Nhưng nếu cần lưu số âm, không được dùng UNSIGNED.