mysql 数据类型(长文解析)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在数据库开发中,MySQL 数据类型的选择直接影响数据存储的效率、查询性能以及业务逻辑的准确性。无论是编程初学者还是中级开发者,理解数据类型的特性与适用场景都是掌握数据库设计的关键。本文将通过通俗易懂的比喻、实际案例和代码示例,系统性地解析 MySQL 数据类型的核心知识点,并提供选择数据类型的实用策略,帮助读者在实际项目中做出合理决策。


一、数值型数据类型:精准控制数字的“尺子”

数值型数据类型用于存储整数、浮点数和定点数。它们如同不同精度的“尺子”,决定了数据的存储范围和计算精度。

1. 整数类型(INT、TINYINT、BIGINT 等)

整数类型适用于存储无小数点的数字。MySQL 提供了多种整数类型,通过调整存储空间(1~8 字节)来平衡性能和容量需求:

类型存储空间取值范围(有符号)场景示例
TINYINT1 字节-128 ~ 127用户性别(0=男,1=女)
SMALLINT2 字节-32768 ~ 32767年龄或省份代码
MEDIUMINT3 字节-8388608 ~ 8388607城市人口或订单编号
INT4 字节-2147483648 ~ 2147483647用户 ID、商品库存
BIGINT8 字节-922亿 ~ 922亿高并发场景的 ID 或计数器

案例

CREATE TABLE users (  
    id BIGINT PRIMARY KEY,  
    age TINYINT CHECK(age BETWEEN 0 AND 150)  -- 限制年龄在合理范围内  
);  

2. 浮点数类型(FLOAT、DOUBLE)与定点数(DECIMAL)

  • FLOAT/DOUBLE:适合存储需要小数的数值,但存在精度丢失风险(如金融计算应避免使用)。
  • DECIMAL:通过指定精度(总位数)和小数位数,精确存储数值,常用于货币或科学计算。

比喻

  • FLOAT 像“模糊的电子秤”,适合日常称重;
  • DECIMAL 像“实验室天平”,确保分毫不差。

代码示例

CREATE TABLE products (  
    price DECIMAL(10, 2)  -- 总10位,小数2位(如 9999999.99)  
);  

二、字符串类型:灵活管理文本的“容器”

字符串类型用于存储文本、字符或二进制数据。根据存储需求,可选择不同容量的“容器”类型。

1. 固定长度字符串:CHAR

CHAR(n) 类型占用固定长度(n 字节),适合长度稳定的字段,如手机号(11 位)、邮政编码(6 位)。

特点

  • 长度不足时自动补空格,查询效率高;
  • 不适合内容不定长的字段(如文章内容)。

案例

CREATE TABLE users (  
    phone CHAR(11)  -- 强制存储 11 位数字(如 "13812345678")  
);  

2. 可变长度字符串:VARCHAR

VARCHAR(n) 类型根据实际内容动态调整存储空间,适合长度变化较大的场景,如用户名、标题。

公式:存储空间 = 实际长度 + 1/2 字节(记录长度)

最佳实践

  • 预估最大长度时,建议保留 20% 余量;
  • 避免将 VARCHAR(255) 用于超长文本(如文章内容)。

代码示例

CREATE TABLE articles (  
    title VARCHAR(100),  -- 标题通常不超过 100 字符  
    content TEXT         -- 长文本用 TEXT  
);  

3. 超长文本类型:TEXT 和 BLOB

  • TEXT:存储大段文本(最大 65535 字节),适合文章、评论等内容;
  • BLOB:二进制大对象,用于存储图片、PDF 等非文本文件。

注意

  • 频繁查询大文本字段会影响性能,建议拆分存储或使用外键关联;
  • 使用 MEDIUMTEXTLONGTEXT 可扩展存储容量。

三、日期和时间类型:时间的“日历与钟表”

时间类型用于记录日期、时间或两者组合,支持多种格式化操作。

1. 基础时间类型

类型存储格式场景示例
DATEYYYY-MM-DD生日、注册日期
TIMEHH:MM:SS上班打卡时间
DATETIMEYYYY-MM-DD HH:MM:SS订单创建时间
TIMESTAMPYYYYMMDDHHMMSS自动记录修改时间

关键区别

  • DATETIME 允许手动设置,而 TIMESTAMP 默认自动记录插入或更新时间;
  • TIMESTAMP 的存储范围较窄(1970-01-01 至 2038-01-19)。

代码示例

CREATE TABLE orders (  
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,  -- 手动设置时间  
    updated_at TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  -- 自动更新  
);  

2. 时间计算与函数

MySQL 提供了丰富的日期函数,例如:

SELECT DATE_ADD('2023-01-01', INTERVAL 1 MONTH) AS next_month;  -- 2023-02-01  
SELECT DATEDIFF('2023-12-31', '2023-01-01') AS days_in_year;  -- 364  

四、枚举(ENUM)与集合(SET):预定义值的“选择器”

ENUMSET 类型允许用户从预定义的列表中选择值,确保数据的规范性。

1. ENUM(枚举类型)

CREATE TABLE users (  
    role ENUM('admin', 'user', 'guest') DEFAULT 'user'  
);  
  • 存储为 TINYINT,节省空间;
  • 通过索引加速查询(如筛选所有管理员)。

2. SET(集合类型)

允许多选值:

CREATE TABLE permissions (  
    access SET('read', 'write', 'delete')  
);  
  • 例如 'read,delete' 表示同时拥有读取和删除权限;
  • 使用时需注意位运算的复杂性。

五、JSON 类型:结构化数据的“瑞士军刀”

JSON 类型(MySQL 5.7+)支持存储和查询结构化数据,适用于灵活多变的业务场景,如用户配置或动态表单。

优势

  • 可嵌套对象和数组,避免频繁修改表结构;
  • 支持 JSON 函数操作(如 JSON_EXTRACT)。

代码示例

CREATE TABLE configs (  
    user_id INT PRIMARY KEY,  
    settings JSON  
);  

INSERT INTO configs (user_id, settings)  
VALUES (1, '{"theme": "dark", "notifications": {"email": true}}');  

-- 查询主题为 "dark" 的用户  
SELECT * FROM configs  
WHERE JSON_EXTRACT(settings, '$.theme') = 'dark';  

六、选择数据类型的策略:平衡存储与性能

1. 根据业务需求选择类型

  • 精确性优先:货币金额用 DECIMAL,避免浮点误差;
  • 存储效率优先:小范围整数用 TINYINT,而非 INT

2. 预留扩展空间

  • 预估字段可能的扩展(如 VARCHAR(255) 而非 VARCHAR(50));
  • 使用 UNSIGNED 修饰符扩大正数范围(如 INT UNSIGNED 最大值为 42亿)。

3. 避免常见陷阱

  • 过早优化:不要为 100 万用户 ID 选择 BIGINTINT 已足够);
  • 类型兼容性:避免将字符串存入数值类型(如 price VARCHAR 会导致计算错误)。

结论

MySQL 数据类型的选择是数据库设计的核心环节,直接影响系统的性能、安全性和可维护性。通过合理使用 INTVARCHARDATETIME 等基础类型,结合 ENUMJSON 等高级类型,开发者可以构建高效且灵活的数据库模型。本文通过案例与代码示例,帮助读者系统性地掌握 MySQL 数据类型的核心知识,为实际项目提供可靠的技术参考。建议读者在实践中结合业务场景反复验证,逐步形成适合自己的数据类型选择策略。

最新发布