mysql数据库中数据类型如何选择_mysql字段设计方法-mysql教程

优先用VARCHAR(n)(n=实际最大长度+10%余量),超255字符且不常查询的字段选TEXT;布尔用TINYINT UNSIGNED或ENUM;时间按“发生”选TIMESTAMP、“指定”选DATETIME;整数计数用BIGINT,金额用DECIMAL(M,D)。

用 VARCHAR 还是 TEXT?看长度和索引需求

超过 255 字符且不常用于 WHERE 或 ORDER BY 的字段(如文章正文、日志内容),优先选 TEXT;否则统一用 VARCHAR(n),n 取业务实际最大长度 + 10% 余量。MySQL 8.0+ 中 VARCHAR(65535) 理论上限受行总长限制(65535 字节),但实际受字符集影响:utf8mb4 下一个字符占 4 字节,所以最多约 16383 个字符。

常见错误:把用户昵称设成 TEXT —— 导致无法直接建普通索引(需指定前缀长度),也增加排序/分组开销;反过来,把固定长度的编码(如身份证号、订单号)设成 VARCHAR(255) 浪费存储和比较成本。

  • VARCHAR 存储时保留实际长度,适合长度波动大、常参与查询的字段
  • TEXT 不计入行内存储(InnoDB 存单独页),不能有默认值(除非 MySQL 5.7+ 且显式指定 NOT NULL DEFAULT '')
  • 需要全文检索?必须用 TEXT + FULLTEXT 索引,VARCHAR 不支持

TINYINT(1) 不等于布尔值,BOOLEAN 只是别名

MySQL 没有原生布尔类型,BOOLEAN 和 BOOL 都被自动转为 TINYINT(1),存的是数字 0/1,不是 true/false 字面量。ORM(如 Django、Laravel)可能自动转换,但直连 MySQL 时写 WHERE status = TRUE 实际等价于 WHERE status = 1,语义易误导。

更严重的问题是 TINYINT(1) 的显示宽度(1)毫无意义——它不影响取值范围(仍是 -128~127 或 0~255),也不限制输入值,INSERT INTO t VALUES (999) 会静默截断为 255(开启严格模式才报错)。

  • 表示开关状态,用 TINYINT UNSIGNED(0~255),明确业务含义(如 0=待处理, 1=成功, 2=失败)
  • 避免用 TINYINT(1) 声称“存布尔”,代码里还得额外注释含义
  • 如果只用 0/1 且绝不会扩展,ENUM('false','true') 更自文档化,但注意 ENUM 是字符串比较,性能略低

时间字段选 DATETIME 还是 TIMESTAMP?关键看时区和范围

TIMESTAMP 自动转为 UTC 存储、读取时转回当前会话时区,范围小(1970–2038),适合记录“事件发生时间”(如创建时间、更新时间);DATETIME 按字面值存储,不涉及时区转换,范围大(1000–9999),适合记录“计划时间”(如会议开始时间、合同到期日)。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » mysql数据库中数据类型如何选择_mysql字段设计方法-mysql教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4000130+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4000130+
  • 本周更新: 0+
  • 最后更新: 2026-03-16