讲师中心 微信公众号
AI工具推荐 视频效率加速

MySQL数据类型有哪些以及如何选择

老晨同学_3721

老晨同学_3721

发布时间:2026-08-18 10:59:15

|

956人浏览过

|

来源于php中文网

原创

MySQL数据类型应按需选择最小够用者:整数选TINYINT/INT/BIGINT UNSIGNED,金额必用DECIMAL,字符串据长度选CHAR/VARCHAR/TEXT,时间据时区需求选TIMESTAMP/DATETIME。

mysql数据类型有哪些以及如何选择

直接说结论:MySQL 数据类型不是越多越好,而是按需选最小够用的那个。选大了浪费空间、拖慢索引;选小了 runtime 报 Out of range value 或静默截断;用错类型(比如用 FLOAT 存金额)可能引发资损。

整数类型怎么选:TINYINT 到 BIGINT 的实际分界点

别看文档列了一堆类型,日常 90% 场景只用到三个:

  • TINYINT UNSIGNED:状态字段(如 status)、布尔(0/1)、枚举值个数 ≤ 255 的场景。1 字节,存 0–255,别写 TINYINT(1) —— 括号里的数字是显示宽度,跟存储无关,还容易误导人。
  • INT UNSIGNED:用户 ID、订单号、计数器等常规主键或正整数字段。4 字节,上限 42 亿,对大多数单库业务足够;如果用自增,注意 INT 溢出后会从 0 重开始(除非设了 auto_increment_increment)。
  • BIGINT UNSIGNED:分布式 ID(Snowflake)、毫秒级时间戳、超大计数(如日活统计)、未来可能分库分表的主键。8 字节,代价是索引体积翻倍、JOIN 和排序更耗内存。

容易踩的坑:

  • 用 BIGINT 存年龄、状态、开关位 —— 浪费 7 字节/行,百万行就多占近 700MB;
  • 用有符号 INT 存用户 ID 却插入负数 —— 不报错但语义错乱;
  • 以为 INT(11) 比 INT(5) 能存更多数 —— 完全一样,都是 4 字节,(11) 只在 ZEROFILL 下起作用(不推荐用)。

小数存钱为什么必须用 DECIMAL,而不是 FLOAT/DOUBLE

因为 FLOAT 和 DOUBLE 是 IEEE 754 浮点数,本质是近似存储。哪怕存 0.1 + 0.2,查出来也可能是 0.30000000000000004。

金融类字段(如 price、balance、discount)必须用 DECIMAL(M,D):

  • M 是总位数(精度),D 是小数位数;例如 DECIMAL(10,2) 表示最多 10 位数字,其中 2 位小数(范围 -99999999.99 ~ 99999999.99);
  • 它按字符串方式精确计算,加减乘除不会丢精度;
  • 性能略低于 FLOAT,但对账、结算这类场景,精度优先级远高于那点 CPU 时间。

常见错误:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 建表时写 price FLOAT(10,2) —— FLOAT 不支持括号里的 (M,D) 精度声明,MySQL 会忽略并按默认单精度存,结果不可控;
  • 用 DOUBLE 存余额,做 sum() 后和对账系统差几分钱,排查半天才发现是浮点误差累积。

字符串类型:CHAR、VARCHAR、TEXT 怎么不踩内存和索引坑

核心判断逻辑就一条:长度是否固定且 ≤ 255 字符?

  • 固定短文本(如国家码 CN、性别 M/F、订单状态 paid)→ 用 CHAR(2) 或 CHAR(10)。InnoDB 会按定义长度分配空间,定长利于缓存对齐,查询更快。
  • 长度明显可变、平均长度 VARCHAR(N)(N 设为预估最大长度)。它只存实际内容 + 1~2 字节长度头,省空间;但要注意:若 N > 5000,某些版本 MySQL 会把该列转成 TEXT 处理,影响索引和排序行为。
  • 纯大文本(文章正文、日志、HTML 片段)→ 用 TEXT 或 MEDIUMTEXT。它们不参与行内存储,而是存指针+外部页,避免单行过大导致 buffer pool 压力;但不能直接建全文索引以外的索引(VARCHAR 才能前缀索引)。

致命误区:

  • 用 VARCHAR(255) 存手机号 —— 实际只需 VARCHAR(20)(含国际区号、+、- 等);255 是历史惯性,不是标准;
  • 给 TEXT 字段加 INDEX —— MySQL 会报错或静默转为前缀索引(如 INDEX(content(255))),但搜全文时大概率失效;
  • 用 CHAR 存昵称(最长 30,但多数 5–10 字)—— 白白浪费 20+ 字节/行,压缩率低,buffer pool 更快被挤满。

时间字段别再用 INT 存时间戳,也别混用 DATETIME 和 TIMESTAMP

Unix 时间戳(秒级或毫秒级整数)看似简单,但会丢掉时区语义、无法用 MySQL 内置时间函数(如 DATE_ADD、TIMESTAMPDIFF)直接处理,后期改需求极痛苦。

正确姿势:

  • 记录「事件发生时间」且需跨时区转换(如用户下单时间)→ 用 TIMESTAMP。它存的是 UTC 时间,读写自动转当前 session 时区,适合日志、审计类场景;但注意:它的范围只有 1970–2038(32 位限制),2038 年问题真实存在。
  • 记录「固定时间点」且无需时区转换(如合同生效日、生日)→ 用 DATETIME。范围大(1000–9999),存的就是字面值,不随时区变;缺点是写入时不自动填充,得显式写 NOW() 或应用层传值。

高频错误:

  • 用 INT 存秒级时间戳 → 查询要 FROM_UNIXTIME(created_at) 才能看,聚合时还得反复转换,索引效率也差;
  • 把 DATETIME 当 TIMESTAMP 用,结果上线后发现不同地区用户看到的时间不一致,还以为是前端 bug;
  • 建表时写 created_at DATETIME DEFAULT CURRENT_TIMESTAMP 却忘了加 ON UPDATE CURRENT_TIMESTAMP(如果需要自动更新)。

真正复杂的地方不在类型列表本身,而在于字段语义是否和类型行为对齐 —— 一个 TINYINT 可以是状态、可以是枚举序号、也可以是布尔,但一旦语义模糊,后期加新状态或迁移就容易崩。

热门AI工具

更多
Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4043

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

851

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1049

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

5901

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2823

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

5880

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

7841

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1070

2024.04.29

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

100

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 180人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 287人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn