阿飞
阿飞
发布于 2025-06-09 / 5 阅读
0
0

MySQL常用字段整理

一、数值类型

1. 整型

字段类型

存储空间

取值范围(有符号)

常用场景

TINYINT

1字节

-128 ~ 127

状态标志(如订单状态)、性别(0/1)、年龄范围

SMALLINT

2字节

-32,768 ~ 32,767

小型数值(如库存量、班级人数)

MEDIUMINT

3字节

-8M ~ 8M

中等规模数据(如城市人口)

INT

4字节

-2.1e9 ~ 2.1e9

主键ID、用户ID、订单号等高频字段

BIGINT

8字节

-9.2e18 ~ 9.2e18

大数量统计(如全球用户量)、时间戳

2. 浮点型与定点型

字段类型

特点

常用场景

FLOAT

单精度,约7位有效数字

非精确计算(如科学测量)

DOUBLE

双精度,约15位有效数字

高精度科学计算

DECIMAL(M,D)

精确小数,M为总位数,D为小数位

财务数据、货币计算(避免浮点误差)


二、字符串类型

1. 短文本

字段类型

特点

常用场景

CHAR(N)

定长,不足补空格

固定长度数据(如身份证号、国家代码)

VARCHAR(N)

变长,按需分配空间

可变长度文本(用户名、地址)

BINARY(N)

定长二进制

加密散列值(如MD5)

VARBINARY(N)

变长二进制

小文件二进制存储

2. 长文本与大对象

字段类型

最大长度

常用场景

TINYTEXT

255字节

短文本(如推文)

TEXT

64KB

文章内容、评论

MEDIUMTEXT

16MB

书籍、日志记录

LONGTEXT

4GB

百科类超长文本

BLOB系列

同TEXT等级别

图片、音频、视频等二进制文件

⚠️ 注意:TEXT/BLOB 不支持默认值,全索引效率低,需前缀索引


三、日期与时间类型

字段类型

格式

常用场景

DATE

YYYY-MM-DD

生日、注册日期

TIME

HH:MM:SS

电影时长、会议时间

DATETIME

YYYY-MM-DD HH:MM:SS

最常用(订单创建时间)

TIMESTAMP

时间戳(UTC)

自动更新字段(如最后修改时间)

YEAR

YYYY

年份记录(如毕业年份)

⚠️ 注意:TIMESTAMP 受时区影响,DATETIME 更稳定。


四、特殊类型

字段类型

特点

常用场景

ENUM

单选预定义值(如性别)

有限选项(星期、月份)

SET

多选预定义值

用户兴趣标签

JSON

结构化数据存储

动态配置、API响应数据

BOOLEAN

TINYINT(1)别名(0/1)

开关状态(是否激活)


五、字段类型选择原则

  1. 最小化存储

    • 优先选最小兼容类型(如状态用TINYINT而非INT)

  2. 精确性优先

    • 财务数据用DECIMAL,避免FLOAT/DOUBLE精度丢失。

  3. 性能优化

    • 频繁查询字段避免用TEXT/BLOB,改用VARCHAR+索引。

  4. 兼容性

    • 存储emoji需utf8mb4字符集(标准utf8不支持4字节)

  5. 扩展性

    • 未来可能增长的字段(如用户名)预留VARCHAR长度。


六、常见错误场景

  1. 错误类型转换

    • 字符串存入数值字段导致插入失败(需显式转换)。

  2. 日期格式混乱

    • 用字符串存日期(如'20250101')无法日期计算,应转DATE

  3. 过度使用ENUM

    • 频繁修改ENUM选项需重构表,建议改用关联表。


七、最佳实践示例

-- 用户表设计
CREATE TABLE users (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, -- 主键
    username VARCHAR(50) NOT NULL,                -- 可变长度用户名
    password CHAR(60) NOT NULL,                   -- 定长加密密码
    email VARCHAR(100) NOT NULL UNIQUE,            -- 唯一邮箱
    age TINYINT UNSIGNED,                         -- 年龄(0~255)
    balance DECIMAL(10,2) DEFAULT 0.00,           -- 账户余额
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,-- 创建时间
    status ENUM('active','inactive') DEFAULT 'active'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


评论