数值类型
约 783 字大约 3 分钟
布欧-Lewyon
2026-05-15
首页 › MySQL › 数据类型与约束(在新窗口打开) › 数值类型
MySQL 提供多种数值类型,按取值范围和存储空间分为整数类型、定点数类型和浮点数类型。选择合适的类型既能节省存储,也能避免精度丢失。
整数类型
| 类型 | 占用字节 | 有符号范围 | 无符号范围 |
|---|---|---|---|
TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
SMALLINT | 2 | -32,768 ~ 32,767 | 0 ~ 65,535 |
MEDIUMINT | 3 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 |
INT (或 INTEGER) | 4 | -2^31 ~ 2^31-1 | 0 ~ 2^32-1 |
BIGINT | 8 | -2^63 ~ 2^63-1 | 0 ~ 2^64-1 |
有符号与无符号
默认是有符号(允许负数)。用 UNSIGNED 关键字声明无符号:
CREATE TABLE example (
age TINYINT UNSIGNED, -- 0 ~ 255,适合年龄
score INT, -- 可正可负
views BIGINT UNSIGNED -- 网页浏览量(非负)
);显示宽度与 ZEROFILL
INT(5) 中的数字不代表存储大小,而是显示宽度:
CREATE TABLE t (
id INT(5) ZEROFILL NOT NULL
);
INSERT INTO t VALUES (123), (12345);
SELECT * FROM t;
-- 输出: 00123, 12345
ZEROFILL会自动添加UNSIGNED属性,且仅影响显示,不影响存储。新项目不推荐使用,已逐渐被淘汰。
浮点数类型
| 类型 | 占用字节 | 说明 |
|---|---|---|
FLOAT | 4 | 单精度,约 7 位有效数字 |
DOUBLE | 8 | 双精度,约 15 位有效数字 |
CREATE TABLE measurement (
temperature FLOAT(7, 3), -- 共7位,小数3位
weight DOUBLE
);浮点数存在精度误差,不适合存储货币、金额等对精度敏感的数据。下面的
DECIMAL才是金融场景的正确选择。
定点数类型
| 类型 | 说明 |
|---|---|
DECIMAL(M, D) (别名 NUMERIC) | 精确小数,M 为总位数,D 为小数位数 |
CREATE TABLE product (
price DECIMAL(10, 2) NOT NULL -- 最多 99999999.99
);
INSERT INTO product VALUES (19.99), (0.99);DECIMAL 在 MySQL 内部以字符串形式存储,不会产生浮点舍入误差。
FLOAT vs DECIMAL 精度对比
-- 浮点数的精度问题
CREATE TABLE float_vs_decimal (
f FLOAT(10, 4),
d DECIMAL(10, 4)
);
INSERT INTO float_vs_decimal VALUES (12345.6789, 12345.6789);
SELECT * FROM float_vs_decimal;
-- f 可能显示 12345.6787(少量误差)
-- d 精确显示 12345.6789自增整数——AUTO_INCREMENT
CREATE TABLE article (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200)
);
INSERT INTO article (title) VALUES ('第一节'), ('第二节');
SELECT * FROM article;
-- id 自动为 1, 2属性:
- 一个表只能有一个
AUTO_INCREMENT字段 - 必须是索引字段(通常为主键)
- 必须为整数或浮点数类型
- 自增值保存在内存中,重启后会按
MAX(id)+1重新计算(InnoDB)
类型选择建议
| 场景 | 推荐类型 |
|---|---|
| 年龄、状态码 | TINYINT |
| 商品数量、短编码 | SMALLINT |
| 用户 ID、订单号 | INT UNSIGNED |
| 超大数据量、分布式 ID | BIGINT |
| 金额、价格、税率 | DECIMAL(M, D) |
| 温度、传感器数据(允许误差) | FLOAT |
| 科学计算、高精度非金额 | DOUBLE |
小结
- 整数类型按场景选最小范围:
TINYINT/SMALLINT/INT/BIGINT。 - 金额等精确场景用
DECIMAL,避免使用FLOAT/DOUBLE。 AUTO_INCREMENT自增字段通常作为主键,一个表仅一个。UNSIGNED用于非负数值场景。
上一节:数据库与表的基本操作 下一节:字符串与文本类型
