首页 > Mysql > Mysql 怎么选择字段?

Mysql 怎么选择字段?

2025-03-30 16:23:01

在 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

二、小数类型(精确计算 vs 近似存储)

类型 存储空间 精度 典型场景
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字节 预定义值,存储空间小 固定选项(如性别、状态)

选择原则

  • 长度固定且短(如手机号11位)用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时间,应用层转换。

五、特殊类型(按需选择)

  • JSONJSONJSONB(MySQL 8.0+),存储结构化数据(如用户扩展信息),支持部分查询优化。
  • 二进制BLOB(二进制)/TEXT(文本),避免存储大文件(建议存URL),小文件(如缩略图)可存LONGBLOB
  • 空间数据GEOMETRY(点、线、面),配合GIS函数(如计算距离),需开启空间索引。

六、避坑指南

  1. 避免过度预留:如手机号固定11位,用CHAR(11)而非VARCHAR(20)
  2. 索引友好:字符串字段长度过长时(如VARCHAR(500)),优先对前缀索引(如name(20))。
  3. 字段默认值:非空字段必须设默认值(如0''CURRENT_TIMESTAMP),避免NULL导致索引失效。
     
  4. 字符集:统一用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 自动创建时间

通过以上标准,可在性能、存储、扩展性之间找到平衡,避免后期频繁修改表结构。

使用 Ctrl+D 可将网站添加到书签
收藏网站
扫描二维码
关注早实习微信公众号
官方公众号
Top