在 MySQL 中,UNSIGNED
屬性用于數值數據類型(如 TINYINT
、SMALLINT
、MEDIUMINT
、INT
和 BIGINT
),表示該列只能存儲非負整數。使用 UNSIGNED
屬性可以有效地擴展列的正整數范圍,因為它不需要為負數保留空間。
1. 定義與用途
- 定義:
UNSIGNED
屬性用于指定數值列只能存儲非負整數。 - 用途:用于只需要存儲正數的場景,如計數器、ID、庫存數量等。
2. 范圍
不同數據類型的 UNSIGNED
和未使用 UNSIGNED
時的取值范圍如下:
TINYINT
:- 有符號(默認):-128 到 127
- 無符號:0 到 255
SMALLINT
:- 有符號(默認):-32,768 到 32,767
- 無符號:0 到 65,535
MEDIUMINT
:- 有符號(默認):-8,388,608 到 8,388,607
- 無符號:0 到 16,777,215
INT
:- 有符號(默認):-2,147,483,648 到 2,147,483,647
- 無符號:0 到 4,294,967,295
BIGINT
:- 有符號(默認):-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
- 無符號:0 到 18,446,744,073,709,551,615
3. 示例代碼
以下是一些示例代碼,展示了如何使用 UNSIGNED
屬性創建表,并插入和檢索數據。
創建表
創建一個包含 UNSIGNED
屬性的表:
CREATE DATABASE test_unsigned_db;
USE test_unsigned_db;CREATE TABLE inventory (item_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,item_name VARCHAR(50) NOT NULL,quantity INT UNSIGNED DEFAULT 0 -- 無符號整數,默認值為0
);
插入數據
插入一些數據:
-- 插入數據
INSERT INTO inventory (item_name, quantity) VALUES
('Laptop', 50),
('Smartphone', 100),
('Tablet', 30);
檢索數據
檢索數據:
SELECT item_id, item_name, quantity FROM inventory;
檢索結果:
+---------+-------------+----------+
| item_id | item_name | quantity |
+---------+-------------+----------+
| 1 | Laptop | 50 |
| 2 | Smartphone | 100 |
| 3 | Tablet | 30 |
+---------+-------------+----------+
插入負數數據(將失敗)
嘗試插入負數數據:
-- 嘗試插入負數數據,將失敗
INSERT INTO inventory (item_name, quantity) VALUES
('Camera', -10);
執行結果:
ERROR 1264 (22003): Out of range value for column 'quantity' at row 1
4. 更復雜的示例:用戶積分系統
以下是一個更復雜的示例,展示了如何在用戶積分系統中使用 UNSIGNED
屬性。
創建用戶積分表
CREATE TABLE user_points (user_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,points BIGINT UNSIGNED DEFAULT 0 -- 無符號大整數,默認值為0
);
插入用戶數據
插入一些用戶數據:
-- 插入用戶數據
INSERT INTO user_points (username, points) VALUES
('john_doe', 1000),
('jane_smith', 1500),
('alice_jones', 2000);
檢索用戶數據
檢索用戶數據:
SELECT user_id, username, points FROM user_points;
檢索結果:
+---------+-------------+--------+
| user_id | username | points |
+---------+-------------+--------+
| 1 | john_doe | 1000 |
| 2 | jane_smith | 1500 |
| 3 | alice_jones | 2000 |
+---------+-------------+--------+
嘗試插入負數積分(將失敗)
嘗試插入負數積分:
-- 嘗試插入負數積分,將失敗
INSERT INTO user_points (username, points) VALUES
('tom_hanks', -500);
執行結果:
ERROR 1264 (22003): Out of range value for column 'points' at row 1
5. 注意事項
- 范圍限制:由于
UNSIGNED
屬性只允許非負數,試圖插入負數會導致錯誤。 - 自動遞增:對于自動遞增(
AUTO_INCREMENT
)的列,使用UNSIGNED
屬性可以有效地擴展 ID 的正整數范圍。 - 兼容性:確保業務邏輯不需要存儲負數,否則使用
UNSIGNED
會導致數據插入失敗。
小結
UNSIGNED
屬性:用于指定數值列只能存儲非負整數,適用于計數器、ID、庫存數量等場景。- 擴展正整數范圍:使用
UNSIGNED
可以有效地擴展列的正整數范圍。 - 實際應用:通過指定
UNSIGNED
屬性,可以確保數據的正整數范圍符合業務需求,提高數據完整性和一致性。
通過理解 UNSIGNED
屬性的用途和特點,可以更好地設計和優化數據庫表,確保數據插入操作符合業務需求。上述示例展示了如何在實際應用中使用 UNSIGNED
屬性設計數據庫表,并插入和檢索數據。