在 MySQL 中选择字段类型时,需结合业务需求、数据范围、性能优化和存储成本综合决策。以下是核心标准和典型场景:
类型 | 存储空间 | 范围(有符号) | 典型场景 |
---|---|---|---|
TINYINT |
1字节 | -128 ~ 127 | 状态标记(0/1)、性别(1/2) |
SMALLINT |
2字节 | -32768 ~ 32767 | 年龄、评分(0-100) |
MEDIUMINT |
3字节 | -8388608 ~ 8388607 | 中小型ID(如用户ID自增) |
INT /INTEGER |
4字节 | -2147483648 ~ 2147483647 | 通用ID、计数(如订单量) |
BIGINT |
8字节 | ±9e18级 | 大ID(如分布式ID、雪花ID) |
选择原则:
TINYINT UNSIGNED
存0-255)。INT UNSIGNED
(范围0~42亿,足够单库单表),超大场景用BIGINT
。类型 | 存储空间 | 精度 | 典型场景 |
---|---|---|---|
DECIMAL(M,D) |
M+2字节(M≤65) | 精确存储(适合财务计算) | 金额(DECIMAL(10,2):最大99999999.99) |
FLOAT |
4字节 | 7位有效数字 | 非精确计算(如温度、概率) |
DOUBLE |
8字节 | 15位有效数字 | 高精度近似(如科学计算) |
选择原则:
DECIMAL
,避免浮点误差。FLOAT/DOUBLE
,节省空间。类型 | 最大长度 | 存储特性 | 典型场景 |
---|---|---|---|
CHAR(L) |
L字节(定长) | 空间换时间(L≤255) | 固定长度字段(如手机号、MD5) |
VARCHAR(L) |
L字符(变长) | 节省空间(L≤65535) | 姓名(VARCHAR(50))、邮箱 |
TEXT |
65535字符 | 无长度前缀,不建议索引 | 长文本(如文章内容) |
ENUM('a','b') |
1-2字节 | 预定义值,存储空间小 | 固定选项(如性别、状态) |
选择原则:
CHAR
,减少碎片。VARCHAR
,并按实际最大长度+10%设置(如昵称最长20字→VARCHAR(60),UTF8MB4占3字节/字符)。ENUM
适合选项固定且少的场景(如性别≤3种),但避免后期修改(新增选项需改表)。类型 | 存储空间 | 范围 | 特性 | 典型场景 |
---|---|---|---|---|
DATE |
3字节 | 1000-01-01 ~ 9999-12-31 | 仅日期 | 出生日期、订单日期 |
DATETIME |
8字节 | 同上 | 时区无关,手动赋值 | 记录绝对时间(如创建时间) |
TIMESTAMP |
4字节 | 1970-01-01 ~ 2038-01-19 | 自动更新(ON UPDATE CURRENT_TIMESTAMP) | 记录修改时间 |
YEAR |
1字节 | 1901 ~ 2155 | 仅年份 | 出版年份、年级 |
选择原则:
TIMESTAMP
,默认时区为服务器时区(建议统一用UTC)。DATETIME
存储UTC时间,应用层转换。JSON
或JSONB
(MySQL 8.0+),存储结构化数据(如用户扩展信息),支持部分查询优化。BLOB
(二进制)/TEXT
(文本),避免存储大文件(建议存URL),小文件(如缩略图)可存LONGBLOB
。GEOMETRY
(点、线、面),配合GIS函数(如计算距离),需开启空间索引。CHAR(11)
而非VARCHAR(20)
。VARCHAR(500)
),优先对前缀索引(如name(20)
)。0
、''
、CURRENT_TIMESTAMP
),避免NULL
导致索引失效。
UTF8MB4
(支持emoji),校对规则用utf8mb4_general_ci
(不区分大小写)。字段 | 类型 | 说明 |
---|---|---|
id | BIGINT UNSIGNED AUTO_INCREMENT | 主键(分布式ID超过INT范围) |
username | VARCHAR(50) NOT NULL | 用户名(索引,最长50字符) |
password | CHAR(60) NOT NULL | 加密后固定长度(如bcrypt) |
balance | DECIMAL(10,2) | 账户余额(精确到分) |
status | TINYINT UNSIGNED | 0-正常,1-封禁(枚举值) |
created_at | TIMESTAMP | 自动创建时间 |
通过以上标准,可在性能、存储、扩展性之间找到平衡,避免后期频繁修改表结构。