news 2026/6/30 18:43:06

MySQL 数据类型详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 数据类型详解


—数据库专栏—

目录

  • 一、引言:为什么数据类型很重要?
  • 二、数据类型分类概览
  • 三、数值类型详解
    • 3.1 整数类型
    • 3.2 浮点数与定点数
  • 四、字符串类型详解
    • 4.1 固定长度与可变长度字符串
    • 4.2 文本类型与二进制类型
    • 4.3 ENUM 与 SET 类型
  • 五、日期与时间类型
  • 六、数据类型选择策略
    • 6.1 CHAR vs VARCHAR
    • 6.2 VARCHAR vs TEXT
    • 6.3 数值类型选择建议
  • 七、实战示例与常见问题
  • 八、总结与参考资料

一、引言:为什么数据类型很重要?

在数据库设计过程中,数据类型的选择直接影响数据的存储效率、查询性能、数据一致性与系统的可扩展性。一个合理的数据类型设计不仅能节省存储空间,还能提升索引效率,降低系统负载。

例如,若将一个只需存储 0/1 状态的字段设置为BIGINT,则会浪费大量存储空间;若将较长的文本内容全部使用VARCHAR存储,则可能导致索引失效或查询性能下降。因此,掌握 MySQL 数据类型的特点与适用场景,是每一位数据库开发者与架构师的基本功。


二、数据类型分类概览

MySQL 支持的数据类型主要分为以下几类:

类型分类包含类型示例主要用途
数值类型INT,FLOAT,DECIMAL存储数字,支持整数、浮点数、定点数
字符串类型CHAR,VARCHAR,TEXT存储文本、字符串
二进制类型BINARY,BLOB存储二进制数据(如图片、文件)
日期时间类型DATE,DATETIME,TIMESTAMP存储日期、时间、时间戳
特殊类型ENUM,SET存储枚举值或集合值

三、数值类型详解

3.1 整数类型

MySQL 提供了多种整数类型,适用于不同范围的整数存储:

类型存储大小有符号范围无符号范围
TINYINT1 Byte-128 ~ 1270 ~ 255
SMALLINT2 Bytes-32768 ~ 327670 ~ 65535
MEDIUMINT3 Bytes-8388608 ~ 83886070 ~ 16777215
INT4 Bytes-2147483648 ~ 21474836470 ~ 4294967295
BIGINT8 Bytes-2^63 ~ 2^63-10 ~ 2^64-1

使用建议

  • 尽量选择能满足需求的最小类型,节省存储空间。
  • 对于状态标志(如性别、是否删除),可使用TINYINTBIT
  • 主键常用INTBIGINT,并设置为自增。

3.2 浮点数与定点数

类型存储大小精度说明适用场景
FLOAT4 Bytes单精度,约7位有效数字对精度要求不高的科学计算
DOUBLE8 Bytes双精度,约15位有效数字普通浮点计算
DECIMAL(M,D)动态精确存储,M为总位数,D为小数位数财务、金额等精确计算

示例代码

-- 创建表,使用 DECIMAL 存储金额CREATETABLEorders(idINTPRIMARYKEYAUTO_INCREMENT,amountDECIMAL(10,2)NOTNULLCOMMENT'订单金额,精确到分');


四、字符串类型详解

4.1 固定长度与可变长度字符串

类型特点存储方式适用场景
CHAR(M)固定长度,M为字符数始终占用 M 个字符的空间长度固定的数据(如身份证、邮编)
VARCHAR(M)可变长度,M为最大字符数实际使用长度 + 1~2 字节记录长度长度变化的数据(如姓名、地址)

对比示例

CREATETABLEuser_info(idINTPRIMARYKEY,id_cardCHAR(18)COMMENT'身份证号',nameVARCHAR(50)COMMENT'姓名');

4.2 文本类型与二进制类型

类型最大长度存储方式适用场景
TEXT65535 字符存储在溢出页文章内容、日志文本
BLOB65535 字节存储在溢出页图片、文件等二进制数据
MEDIUMTEXT16777215 字符溢出页存储较大文本内容
LONGBLOB4GB溢出页存储大型二进制对象

注意TEXTBLOB类型无法直接创建普通索引,建议使用FULLTEXT索引或前缀索引。

4.3 ENUM 与 SET 类型

  • ENUM:从预定义列表中选择一个值
  • SET:从预定义列表中选择多个值

示例

CREATETABLEarticles(idINT,statusENUM('draft','published','archived')DEFAULT'draft',tagsSET('tech','life','travel'));


五、日期与时间类型

类型存储大小格式范围适用场景
DATE3 BytesYYYY-MM-DD1000-01-01 ~ 9999-12-31生日、日期记录
TIME3 BytesHH:MM:SS-838:59:59 ~ 838:59:59时间间隔
DATETIME8 BytesYYYY-MM-DD HH:MM:SS1000-01-01 00:00:00 ~ 9999-12-31 23:59:59记录创建时间、更新时间
TIMESTAMP4 BytesYYYY-MM-DD HH:MM:SS1970-01-01 00:00:01 ~ 2038-01-19 03:14:07自动记录时间戳,支持时区

实战示例

CREATETABLElogs(idINTAUTO_INCREMENTPRIMARYKEY,contentTEXT,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,updated_atTIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP);

六、数据类型选择策略

6.1 CHAR vs VARCHAR

对比维度CHARVARCHAR
存储方式固定长度,补空格可变长度,记录实际长度
存储效率浪费空间(固定分配)节省空间(按需分配)
查询性能高(长度固定,索引效率高)较低(长度变化,索引效率低)
适用场景身份证、MD5、邮编姓名、地址、备注

6.2 VARCHAR vs TEXT

对比维度VARCHARTEXT
最大长度65535 字节65535 字符(可自动升级为更大类型)
存储位置行内(<768B)或溢出页始终溢出页
索引支持支持普通索引仅支持 FULLTEXT 索引
适用场景短文本、频繁查询字段长文本、不常查询内容

6.3 数值类型选择建议

  • 金额、价格等精确计算 →DECIMAL
  • 计数器、状态码 →INTTINYINT
  • 科学计算、非精确数值 →FLOAT/DOUBLE

七、实战示例与常见问题

示例1:创建用户表

CREATETABLEusers(idBIGINTUNSIGNEDAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50)UNIQUENOTNULL,emailVARCHAR(100)UNIQUENOTNULL,password_hashCHAR(64)COMMENT'SHA-256哈希',genderENUM('male','female','other')DEFAULT'other',birth_dateDATE,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

示例2:数据插入与查询

-- 插入数据INSERTINTOusers(username,email,gender,birth_date)VALUES('zhangsan','zhangsan@example.com','male','1990-05-20');-- 查询数据SELECT*FROMusersWHEREgender='male'ANDbirth_date>'1990-01-01';

常见问题:

  1. 为什么 VARCHAR 长度不能超过 65535?

    • 因为 MySQL 中行的最大长度为 65535 字节,且所有列共享该限制。
  2. TIMESTAMP 与 DATETIME 如何选择?

    • 如果需要自动更新时间、支持时区转换,选TIMESTAMP
    • 如果需要存储大范围日期时间,选DATETIME
  3. ENUM 和 SET 是否推荐使用?

    • 在固定值较少、不常变更的情况下可以使用,否则建议使用关联表。

八、总结

总结

数据类型选择是数据库设计的基础环节,合理的选择能:

  • ✅ 提升存储效率
  • ✅ 优化查询性能
  • ✅ 增强数据一致性
  • ✅ 支持系统扩展
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/30 23:21:57

小白必看:什么是WiFi密码字典及其基本用法

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式WiFi密码字典学习应用&#xff0c;通过简单示例演示密码字典的工作原理。要求包含基础知识讲解、简单字典生成演示和实际应用场景说明。使用HTMLJavaScript实现可视化…

作者头像 李华
网站建设 2026/6/25 9:24:35

传统调试 vs AI辅助:解决Internal Server Error的效率对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 构建一个对比工具&#xff0c;左侧展示传统调试步骤&#xff08;查看日志、手动排查等&#xff09;&#xff0c;右侧展示AI辅助调试流程&#xff08;自动分析、建议修复&#xff09…

作者头像 李华
网站建设 2026/6/30 14:21:41

系统迁移时如何处理Temp文件夹?专家建议

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个系统迁移辅助工具&#xff0c;专门处理Temp目录&#xff1a;1) 分析临时文件使用情况 2) 智能识别需要保留的文件 3) 生成迁移报告 4) 支持自定义过滤规则 5) 与主流迁移工…

作者头像 李华
网站建设 2026/6/27 8:34:07

姬无烦科幻与张祥前统一场论的完美融合

姬无烦科幻与张祥前统一场论的完美融合 引言&#xff1a;科幻与科学的奇妙邂逅 当科幻作家的想象力与物理学家的公式相遇&#xff0c;会碰撞出怎样的火花&#xff1f; 在《外星文明与人类未来》这部姬无烦的科幻小说中&#xff0c;我们看到了一个充满奇迹的未来&#xff1a;飞碟…

作者头像 李华
网站建设 2026/6/30 10:04:50

Java并发编程面试题:ThreadLocal(8题)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

作者头像 李华
网站建设 2026/6/29 19:27:41

消息队列设计:从同步到异步的性能突破

前言 2024年初&#xff0c;我们的订单系统经常出现"超时"问题。用户下单后&#xff0c;系统需要同时调用库存服务、支付服务、通知服务&#xff0c;任何一个服务慢都会导致整个请求超时。 我们决定引入消息队列&#xff0c;将同步调用改为异步处理。这个改造带来了…

作者头像 李华