Tóm tắt
Dùng INT UNSIGNED (hoặc TINYINT/SMALLINT/MEDIUMINT/BIGINT UNSIGNED) để cột chỉ chấp nhận số ≥ 0. Chèn số âm → lỗi 1264.
Ví dụ
1. Tạo bảng cột signed
CREATE TABLE preventNegativeNumberDemo (
UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
UserName VARCHAR(20),
UserGameScores INT
);
2. Sửa cột thành UNSIGNED
ALTER TABLE preventNegativeNumberDemo
MODIFY COLUMN UserGameScores INT UNSIGNED NOT NULL;
3. Kiểm tra DESC
DESC preventNegativeNumberDemo;
+----------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+------------------+------+-----+---------+----------------+
| UserId | int(11) | NO | PRI | NULL | auto_increment |
| UserName | varchar(20) | YES | | NULL | |
| UserGameScores | int(10) unsigned | NO | | NULL | |
+----------------+------------------+------+-----+---------+----------------+
4. Thử chèn số âm – LỖI
INSERT INTO preventNegativeNumberDemo (UserName, UserGameScores) VALUES ('Mike', -1);
-- ERROR 1264 (22003): Out of range value for column 'UserGameScores' at row 1
5. Chèn số dương/0 – OK
INSERT INTO preventNegativeNumberDemo (UserName, UserGameScores) VALUES
('Larry', 0), ('John', 100), ('Bob', 200);
SELECT * FROM preventNegativeNumberDemo;
+--------+----------+----------------+
| UserId | UserName | UserGameScores |
+--------+----------+----------------+
| 1 | Larry | 0 |
| 2 | John | 100 |
| 3 | Bob | 200 |
+--------+----------+----------------+
Phạm vi UNSIGNED
| Kiểu | Phạm vi |
|---|---|
| TINYINT UNSIGNED | 0 ~ 255 |
| SMALLINT UNSIGNED | 0 ~ 65,535 |
| MEDIUMINT UNSIGNED | 0 ~ 16,777,215 |
| INT UNSIGNED | 0 ~ 4,294,967,295 |
| BIGINT UNSIGNED | 0 ~ 18,446,744,073,709,551,615 |
Lưu ý
- UNSIGNED không mở rộng phạm vi âm – chỉ dịch phạm vi dương lên gấp đôi.
- Phép toán giữa signed/unsigned có thể gây kết quả bất ngờ – dùng
CAST. AUTO_INCREMENTngầm là UNSIGNED.