MySQL(50)如何使用UNSIGNED属性?

在 MySQL 中,UNSIGNED 属性用于数值数据类型(如 TINYINTSMALLINTMEDIUMINTINTBIGINT),表示该列只能存储非负整数。使用 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 属性的表:

sql 复制代码
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
);

插入数据

插入一些数据:

sql 复制代码
-- 插入数据
INSERT INTO inventory (item_name, quantity) VALUES 
('Laptop', 50),
('Smartphone', 100),
('Tablet', 30);

检索数据

检索数据:

sql 复制代码
SELECT item_id, item_name, quantity FROM inventory;

检索结果:

plaintext 复制代码
+---------+-------------+----------+
| item_id | item_name   | quantity |
+---------+-------------+----------+
|       1 | Laptop      |       50 |
|       2 | Smartphone  |      100 |
|       3 | Tablet      |       30 |
+---------+-------------+----------+

插入负数数据(将失败)

尝试插入负数数据:

sql 复制代码
-- 尝试插入负数数据,将失败
INSERT INTO inventory (item_name, quantity) VALUES 
('Camera', -10);

执行结果:

plaintext 复制代码
ERROR 1264 (22003): Out of range value for column 'quantity' at row 1

4. 更复杂的示例:用户积分系统

以下是一个更复杂的示例,展示了如何在用户积分系统中使用 UNSIGNED 属性。

创建用户积分表

sql 复制代码
CREATE TABLE user_points (
    user_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    points BIGINT UNSIGNED DEFAULT 0  -- 无符号大整数,默认值为0
);

插入用户数据

插入一些用户数据:

sql 复制代码
-- 插入用户数据
INSERT INTO user_points (username, points) VALUES 
('john_doe', 1000),
('jane_smith', 1500),
('alice_jones', 2000);

检索用户数据

检索用户数据:

sql 复制代码
SELECT user_id, username, points FROM user_points;

检索结果:

plaintext 复制代码
+---------+-------------+--------+
| user_id | username    | points |
+---------+-------------+--------+
|       1 | john_doe    |   1000 |
|       2 | jane_smith  |   1500 |
|       3 | alice_jones |   2000 |
+---------+-------------+--------+

尝试插入负数积分(将失败)

尝试插入负数积分:

sql 复制代码
-- 尝试插入负数积分,将失败
INSERT INTO user_points (username, points) VALUES 
('tom_hanks', -500);

执行结果:

plaintext 复制代码
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 属性设计数据库表,并插入和检索数据。

相关推荐
我最厉害。,。41 分钟前
接口安全&SOAP&OpenAPI&RESTful&分类特征导入&项目联动检测
后端·restful
AntBlack3 小时前
计算机视觉 : 端午无事 ,图像处理入门案例一文速通
后端·python·计算机视觉
福大大架构师每日一题4 小时前
2025-06-02:最小可整除数位乘积Ⅱ。用go语言,给定一个表示正整数的字符串 num 和一个整数 t。 定义:如果一个整数的每一位都不是 0,则称该整数为
后端
Code_Artist4 小时前
[Mybatis] 因 0 != null and 0 != '' 酿成的事故,害得我又过点啦!
java·后端·mybatis
程序员博博4 小时前
看到这种代码,我直接气到想打人
后端
南雨北斗4 小时前
php 图片压缩函数
后端
L2ncE4 小时前
ES101系列08 | 数据建模和索引重建
java·后端·elasticsearch
还是鼠鼠5 小时前
Maven---配置本地仓库
java·开发语言·后端·maven
无问8175 小时前
SpringBoot:统一功能处理、拦截器、适配器模式
spring boot·后端·适配器模式
一只叫煤球的猫5 小时前
MySQL虚拟列:一个被低估的MySQL特性
数据库·后端·mysql