MySQL【数据类型】

【MySQL 笔记】数据类型详解(2026 年生产视角)

MySQL 的数据类型选择直接影响存储空间查询性能索引效率数据正确性
选错了类型,后期改成本非常高(尤其是大表)。

一、MySQL 8.0+ 最常用数据类型对比表(推荐记忆版)

分类类型存储大小实际取值范围是否有符号推荐场景(2026主流)常见误用坑
整数TINYINT1 字节-128 ~ 127 / 0 ~ 255有/无状态码、性别、枚举(0/1/2)别存年龄(>127会溢出)
SMALLINT2 字节-32768 ~ 32767 / 0 ~ 65535有/无标签数量、城市编码
MEDIUMINT3 字节-8388608 ~ 8388607有/无极少用(节省空间时)基本被 INT 取代
INT / INTEGER4 字节-21亿 ~ 21亿 / 0 ~ 42亿有/无用户ID、订单ID(无符号)、点赞数别用在未来可能超 42 亿的场景
BIGINT8 字节-9e18 ~ 9e18 / 0 ~ 1.8e19有/无主键、雪花ID、支付金额(分)、时间戳最安全的选择(现代项目主力)
小数DECIMAL(M,D) / NUMERIC按精度计算精确小数(M总位数,D小数位)金额、汇率、积分(必须用别用 FLOAT/DOUBLE 存钱!
FLOAT4 字节≈ ±3.4E±38(7位有效数字)科学计算、统计近似值精度丢失严重
DOUBLE8 字节≈ ±1.79E±308(15~16位有效数字)高精度科学计算金融场景禁用
字符串CHAR(n)n 字节(固定)0~255 字符固定长度(如性别 M/F、省份代码)浪费空间(短字符串也占满)
VARCHAR(n)实际长度+1~2字节0~65535 字节(utf8mb4 下≈16383字符)用户名、昵称、标题、地址(最常用n 设太大浪费索引空间
TINYTEXT最大 255 字节极短文本基本不用
TEXT最大 64KB文章正文、评论、富文本索引限制(只能前缀)
MEDIUMTEXT最大 16MB长文章、日志
LONGTEXT最大 4GB超长内容(很少用)慎用,性能差
日期时间DATE3 字节1000-01-01 ~ 9999-12-31生日、注册日期
DATETIME5~8 字节1000-01-01 00:00:00 ~ 9999-12-31 23:59:59创建时间、订单时间(最常用带时区需求用 TIMESTAMP
TIMESTAMP4 字节1970-01-01 ~ 2038-01-19自动更新时间(2038问题)2038 年问题(已基本被 DATETIME 取代)
TIME3 字节-838:59:59 ~ 838:59:59时长、营业时间
YEAR1 字节1901 ~ 2155年份(极少用)
JSONJSON按内容最大 1GB配置、扩展字段、复杂结构(现代主力大 JSON 慎用(查询性能)
其他ENUM(‘男’,’女’,’保密’)1~2 字节枚举值性别、状态(小范围固定值)扩展困难(加值要改表)
SET1~8 字节多选枚举标签(少量固定)基本被 JSON 取代
BIT(n)n/8 字节位字段权限位图(极少用)可读性差

二、2026 年生产环境推荐组合(强烈建议)

场景推荐类型组合为什么
主键 / 关联IDBIGINT UNSIGNED AUTO_INCREMENT安全、足够大、索引友好
用户名/昵称/标题VARCHAR(64) ~ VARCHAR(255)utf8mb4 下够用,索引前缀够长
手机号VARCHAR(20) 或 CHAR(11)考虑 +86 等前缀,VARCHAR 更灵活
金额 / 单价DECIMAL(12,2) 或 DECIMAL(18,4)精确、无误差
创建/更新时间DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3)毫秒级、自动维护、跨时区友好
状态码TINYINT UNSIGNED0~255 足够,索引小
性别/审核状态TINYINT(1) 或 ENUMTINYINT 更灵活(后期加状态容易)
评论/文章正文TEXT 或 MEDIUMTEXT根据长度选
扩展字段JSON灵活、无需频繁改表

三、常见致命误用 & 血泪教训

  1. INT 做用户ID → 公司用户破 42 亿时崩溃
  2. FLOAT/DOUBLE 存金额 → 0.1 + 0.2 ≠ 0.3
  3. VARCHAR(500) 存用户名 → 索引占用巨大,查询变慢
  4. TIMESTAMP 存未来时间 → 2038 年问题(虽已少见,但仍需警惕)
  5. 所有字段都允许 NULL → 逻辑混乱 + 索引效率下降
  6. CHAR 存变长内容 → 空间浪费严重
  7. 枚举用 ENUM 存动态状态 → 后期加值要 ALTER TABLE

四、快速记忆口诀(生产选型三原则)

  1. 能用小的绝不用大的(TINYINT > SMALLINT > INT > BIGINT)
  2. 能精确就别用浮点(金额、比率必须 DECIMAL)
  3. 时间优先 DATETIME(3)(除非明确要自动更新且不关心 2038)
  4. 字符串优先 VARCHAR(CHAR 只在固定长度极短时用)
  5. 现代项目 JSON 救急(但别滥用)

下一期预告建议:MySQL 索引全家桶(上)—— 索引类型 + 聚簇 vs 非聚簇 + 最左前缀原则

有哪个数据类型在你的项目里选型争议最大,或者踩过最坑的类型,欢迎留言讨论~
祝大家字段类型选得又省又稳!📏

文章已创建 5186

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部