MySQL 字段类型选择会直接影响数据准确性、存储空间、查询性能和后续维护。很多数据库问题不是 SQL 写错,而是一开始字段类型选得不合适,比如金额用了 FLOAT,长文本用了 VARCHAR,状态值用了随意字符串。
字段类型没有绝对标准,关键是根据数据含义选择合适类型。本文围绕常见的 VARCHAR、TEXT、INT、DECIMAL 等类型,讲清它们适合什么场景,以及实际建表时该注意什么。
先看数据含义
选择字段类型前,先问几个问题:这个字段存的是文本、数字、金额、时间还是状态?是否需要排序和计算?最大长度大概多少?是否允许为空?是否需要建立索引?
字段类型不是随便选一个能存进去就行。能存和适合存,是两回事。
VARCHAR 场景
VARCHAR 适合存储长度可变、但有明确上限的短文本,比如用户名、邮箱、手机号、标题、订单号、URL、标签名等。
username VARCHAR(50)
email VARCHAR(255)
title VARCHAR(200)
VARCHAR 的长度要根据业务设置,不建议所有字段都写 255。长度过大虽然不一定立刻占满空间,但会影响索引设计和字段语义。

TEXT 场景
TEXT 适合存储较长文本,比如文章正文、商品详情、用户备注、日志内容等。它不适合用来存所有字符串。
content TEXT
remark TEXT
如果字段经常用于查询条件、排序或索引,使用 TEXT 要更谨慎。长文本通常不适合作为高频筛选字段。
VARCHAR 和 TEXT 区别
简单判断:有明确长度上限、经常查询或索引的短文本,用 VARCHAR;长度较长、主要用于展示的正文内容,用 TEXT。
比如文章标题用 VARCHAR,文章正文用 TEXT;商品名称用 VARCHAR,商品详情用 TEXT。不要为了省事把所有文本都用 TEXT。
INT 场景
INT 适合存储整数,比如用户 ID、文章 ID、数量、状态码、排序值、计数器等。
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
views INT UNSIGNED DEFAULT 0
status TINYINT DEFAULT 1
如果数值不可能为负,可以使用 UNSIGNED。它能扩大正数范围,也能表达字段语义。
选择整数大小
MySQL 有多种整数类型,比如 TINYINT、SMALLINT、INT、BIGINT。状态值、布尔值可以用 TINYINT,普通自增 ID 可以用 INT 或 BIGINT,具体取决于数据规模。
is_deleted TINYINT UNSIGNED DEFAULT 0
user_id BIGINT UNSIGNED
不要所有整数都用 BIGINT,也不要在可能增长很大的业务里用太小的类型。选型要结合预估数据量。
DECIMAL 场景
金额、价格、费率等需要精确小数的字段,应该使用 DECIMAL,不要使用 FLOAT 或 DOUBLE。
price DECIMAL(10, 2)
balance DECIMAL(12, 2)
DECIMAL(10, 2) 表示总共 10 位数字,其中小数 2 位。它适合需要精确计算的财务类数据。
为什么不用 FLOAT 存钱
FLOAT 和 DOUBLE 是浮点数,适合科学计算或允许误差的场景,不适合存金额。浮点数可能出现精度误差,导致金额计算不准确。
涉及订单、余额、支付、结算等业务时,优先使用 DECIMAL。也有项目会用整数存分,比如 1999 表示 19.99 元,这同样可以避免小数精度问题。
日期时间类型
时间字段常见类型包括 DATE、DATETIME、TIMESTAMP。生日、日期选择可以用 DATE;业务创建时间、更新时间常用 DATETIME;需要时区转换特性的场景可以评估 TIMESTAMP。
created_at DATETIME
updated_at DATETIME
无论选哪种类型,都要统一项目里的时间存储规范,避免一部分存字符串、一部分存时间戳、一部分存 DATETIME。
状态字段
状态字段可以使用 TINYINT 或枚举字典。比如 0 表示禁用,1 表示启用,2 表示待审核。
status TINYINT UNSIGNED DEFAULT 1
如果状态含义较多,建议在代码或字典表中维护映射,不要让魔法数字散落在各处。
是否允许 NULL
字段是否允许 NULL 也很重要。必填字段建议设置 NOT NULL,并根据情况提供默认值。
title VARCHAR(200) NOT NULL
views INT UNSIGNED NOT NULL DEFAULT 0
NULL 表示未知或不存在,空字符串表示已知为空。二者语义不同,不要混用。
索引影响
字段类型会影响索引。短字段更适合建立索引,长文本索引成本更高。联合索引中字段长度、选择性和顺序都要考虑。
如果某个字段经常用于 WHERE、ORDER BY、JOIN,就要更谨慎地选择类型和长度。类型不一致还可能导致隐式转换,影响索引使用。
常见错误
第一种错误是金额用 FLOAT。第二种错误是所有字符串都用 VARCHAR(255)。第三种错误是长正文用 VARCHAR。第四种错误是状态字段用随意字符串且没有规范。第五种错误是本该 NOT NULL 的字段允许 NULL,导致查询逻辑复杂。
实践建议
字段类型设计可以按这个思路:短文本用 VARCHAR,长内容用 TEXT,整数按范围选择 TINYINT/INT/BIGINT,金额用 DECIMAL,时间用统一的日期时间类型,状态字段用小整数并维护字典。
表结构一旦上线,后期修改成本会变高。建表前多想清楚字段含义、数据范围和查询方式,比后期频繁改字段更划算。













暂无评论内容