Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Ngăn chặn số âm trong MySQL bằng INT UNSIGNED

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ểuPhạm vi
TINYINT UNSIGNED0 ~ 255
SMALLINT UNSIGNED0 ~ 65,535
MEDIUMINT UNSIGNED0 ~ 16,777,215
INT UNSIGNED0 ~ 4,294,967,295
BIGINT UNSIGNED0 ~ 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_INCREMENT ngầm là UNSIGNED.