本系列可作为数据库学习系列的笔记,文中提到的一些练习的代码,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。
点赞关注不迷路!您的点赞、关注和收藏是对小编最大的支持和鼓励!
系列文章目录
目录
目录
[2.1 整数类型完整列表(含大小、范围、用途)](#2.1 整数类型完整列表(含大小、范围、用途))
[2.2 小数类型(浮点 vs 定点)](#2.2 小数类型(浮点 vs 定点))
[2.2.1 FLOAT(单精度)](#2.2.1 FLOAT(单精度))
[2.2.2 DOUBLE(双精度)](#2.2.2 DOUBLE(双精度))
[2.2.3 DECIMAL (M,D)(高精度定点数)](#2.2.3 DECIMAL (M,D)(高精度定点数))
[3.1 字符串类型完整清单](#3.1 字符串类型完整清单)
[3.2 CHAR 与 VARCHAR 深度对比(面试高频)](#3.2 CHAR 与 VARCHAR 深度对比(面试高频))
[3.2.1 CHAR (M) 固定长度](#3.2.1 CHAR (M) 固定长度)
[3.2.2 VARCHAR (M) 可变长度](#3.2.2 VARCHAR (M) 可变长度)
[3.2.3 经典示例(文档原版)](#3.2.3 经典示例(文档原版))
[3.3 VARCHAR 与 TEXT 深度区别(开发必懂)](#3.3 VARCHAR 与 TEXT 深度区别(开发必懂))
[3.4 ENUM 与 SET(极高效、极省空间)](#3.4 ENUM 与 SET(极高效、极省空间))
[3.4.1 ENUM 枚举(单选)](#3.4.1 ENUM 枚举(单选))
[3.4.2 SET 集合(多选)](#3.4.2 SET 集合(多选))
[5.1 日期类型完整清单](#5.1 日期类型完整清单)
[关键参数:fsp 小数秒精度](#关键参数:fsp 小数秒精度)
[5.2 DATETIME 与 TIMESTAMP 核心区别](#5.2 DATETIME 与 TIMESTAMP 核心区别)
[7.1 数值类型怎么选](#7.1 数值类型怎么选)
[7.2 字符串怎么选](#7.2 字符串怎么选)
[7.3 日期怎么选](#7.3 日期怎么选)
前言
小编作为新晋码农一枚,会定期整理一些写的比较好的代码,作为自己的学习笔记,会试着做一下批注和补充,如转载或者参考他人文献会标明出处,非商用,如有侵权会删改!欢迎大家斧正和讨论!
在 MySQL 建表时,字段数据类型是决定表性能、存储空间、数据准确性与后期扩展性的核心。选得不对,轻则数据溢出、精度丢失,重则索引失效、查询缓慢、重构困难。
一、为什么必须学数据类型
在面向对象开发里:
- 类 → 数据库表
- 类属性 → 表字段
- 对象实例 → 表行数据
要给字段存值,就必须先规定它能存什么、占多大空间、怎么存储 。这就是数据类型。
MySQL 常用数据类型分为四大类:
- 数值类型
- 字符串类型
- 二进制类型
- 日期与时间类型
二、数值类型(最常用、最容易溢出)
数值类型分为:整数、浮点数、定点数、位类型、布尔型。
2.1 整数类型完整列表(含大小、范围、用途)
| 类型 | 占用字节 | 有符号范围 | 无符号(UNSIGNED)范围 | 典型业务场景 |
|---|---|---|---|---|
| BIT(M) | 1~64 位 | --- | --- | 位存储、开关 |
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 状态、性别、是否删除 |
| SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 | 类型、小枚举 |
| MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 | 较大计数 |
| INT / INTEGER | 4 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 | 用户 ID、订单 ID、通用数字 |
| BIGINT | 8 | -2⁶³ ~ 2⁶³-1 | 0 ~ 2⁶⁴-1 | 分布式 ID、超大金额、日志 ID |
特别说明
-
BOOL / BOOLEAN 本质就是 TINYINT(1)
- 0 → false
- 非 0 → true
-
**BIT(M)**M 表示位数,1~64,省略 M 则默认 1 位。适合存极省空间的布尔位。
2.2 小数类型(浮点 vs 定点)
2.2.1 FLOAT(单精度)
- 占用:4 字节
- 精度:约 7 位有效数字
- 语法:
FLOAT(M,D)M = 总位数,D = 小数位数
2.2.2 DOUBLE(双精度)
- 占用:8 字节
- 精度:约 15 位有效数字
- 语法:
DOUBLE(M,D)
2.2.3 DECIMAL (M,D)(高精度定点数)
- 占用:动态字节
- 无精度丢失(最关键)
- M 最大:65
- D 最大:30
- 默认:DECIMAL (10,0)
M中不计算小数喊口号和负数的,如果D为0,则具体的值不保存小数点和小数部分(也就是说保存的是一个整数)
开发铁律(必背)
- 金额、价格、财务、交易 → 必须用 DECIMAL
- 禁止用 FLOAT/DOUBLE 存钱,会出现精度丢失!
在有些系统中表示金额,一般把元为单位换成分,然后用int类型表示金额。
三、字符串类型(最复杂、面试最多)
字符串分为:
- 定长字符串:CHAR
- 变长字符串:VARCHAR
- 文本类型:TINYTEXT / TEXT / MEDIUMTEXT / LONGTEXT
- 二进制字符串:BINARY / VARBINARY / BLOB 系列
- 枚举:ENUM
- 集合:SET
3.1 字符串类型完整清单
| 类型 | 说明 | 最大长度 |
|---|---|---|
| CHAR(M) | 固定长度字符 | 255 字符 |
| VARCHAR(M) | 可变长度字符 | 65535 字节 |
| TINYTEXT | 极小文本 | 255 字节 |
| TEXT | 普通文本 | 65535 字节(64KB) |
| MEDIUMTEXT | 中文本 | 16MB |
| LONGTEXT | 大文本 | 4GB |
| BINARY(M) | 固定长度二进制 | 255 字节 |
| VARBINARY(M) | 可变长度二进制 | 65535 字节 |
| TINYBLOB | 小二进制 | 255 字节 |
| BLOB | 二进制 | 64KB |
| MEDIUMBLOB | 中二进制 | 16MB |
| LONGBLOB | 大二进制 | 4GB |
| ENUM | 单选枚举 | 65535 个值 |
| SET | 多选集合 | 64 个值 |
3.2 CHAR 与 VARCHAR 深度对比(面试高频)
3.2.1 CHAR (M) 固定长度
- M:字符数,0~255
- 不足长度用空格填充
- 查询时自动删除尾部空格
- 速度快、浪费空间
- 适合:长度固定的数据例:身份证、手机号、学号、邮编、MD5、UUID
3.2.2 VARCHAR (M) 可变长度
- M:最大字符数
- 实际用多少存多少
- 用 1~2 字节 记录真实长度
- ≤255 字节:1 字节
-
255 字节:2 字节
- 查询时保留尾部空格
- 节省空间、速度略低
- 适合:长度不固定的数据例:姓名、标题、地址、备注
3.2.3 经典示例(文档原版)
sql
CREATE TABLE vc (
v VARCHAR(4),
c CHAR(4)
);
INSERT INTO vc VALUES ('ab ', 'ab ');
查询:
sql
SELECT CONCAT('(',v,')'), CONCAT('(',c,')') FROM vc;
结果:
bash
(ab) (ab)
原因:
- CHAR 会删掉末尾空格
- VARCHAR 会截断超长空格并报警告
3.3 VARCHAR 与 TEXT 深度区别(开发必懂)
| 对比项 | VARCHAR | TEXT |
|---|---|---|
| 最大长度 | 65535 字节 | 65535 字节,超了自动升级 |
| 存储方式 | <768 字节存行内,否则溢出 | 全部存在溢出页 |
| 索引 | 可以建普通索引 | 不能直接建普通索引,只能全文索引 |
| 查询性能 | 高 | 低 |
| 适用场景 | 需要检索、短内容 | 大内容、不常检索 |
开发原则:能 VARCHAR 绝对不用 TEXT!
3.4 ENUM 与 SET(极高效、极省空间)
3.4.1 ENUM 枚举(单选)
- 从列表中只能选一个
- 内部以整数存储
- 最多 65535 个选项
示例:
sql
gender ENUM('男','女','未知')
3.4.2 SET 集合(多选)
- 从列表中可选多个
- 内部以整数存储
- 最多 64 个选项
示例:
sql
hobby SET('游泳','跑步','游戏','读书')
四、二进制类型(存文件、字节流)
二进制类型和字符串对应,但存的是字节,不是字符。
- BINARY → 对应 CHAR
- VARBINARY → 对应 VARCHAR
- BLOB 系列 → 对应 TEXT 系列
用途:
- 图片字节
- 文件流
- 加密字节
- 不适合直接阅读的二进制数据
现代开发一般不把文件存在数据库,而是存文件路径,二进制类型用得越来越少。
五、日期与时间类型(自动维护、时区、自动更新)
MySQL 提供 5 种日期时间类型,比用字符串存时间更省空间、更容易排序、更安全。
5.1 日期类型完整清单
| 类型 | 字节 | 范围 | 格式 | 用途 |
|---|---|---|---|---|
| DATE | 3 | 1000-01-01 ~ 9999-12-31 | YYYY-MM-DD | 只存日期 |
| TIME | 3 | -838:59:59 ~ 838:59:59 | hh:mm:ss | 只存时间 |
| YEAR | 1 | 1901 ~ 2155 | YYYY | 只存年份 |
| DATETIME | 8 | 1000~9999 | YYYY-MM-DD hh:mm:ss | 业务时间 |
| TIMESTAMP | 4 | 1970-2038 | 时间戳 | 更新时间、自动维护 |
关键参数:fsp 小数秒精度
- 0~6 位,默认 0
- 示例:
DATETIME(3)精确到毫秒 - 示例:
TIMESTAMP(6)精确到微秒
常用系统时间函数
NOW()/CURRENT_TIMESTAMP→ 当前日期时间CURDATE()→ 当前日期CURTIME()→ 当前时间
5.2 DATETIME 与 TIMESTAMP 核心区别
DATETIME
- 范围大:1000--9999
- 不受时区影响
- 手动赋值
- 占用 8 字节
TIMESTAMP
- 范围小:1970--2038
- 受时区影响
- 可设置
ON UPDATE CURRENT_TIMESTAMP - 占用 4 字节
开发最佳实践
- 业务时间(创建时间、生日、下单时间)→ DATETIME
- 更新时间(自动刷新)→ TIMESTAMP
六、字符串排序规则与字符集(文档重点)
-
字符串以字符为单位 ,可单独指定字符集与排序规则例:
utf8mb4+utf8mb4_0900_ai_ci -
二进制以字节为单位 ,排序按数字编码例:
utf8mb4_bin -
_ci:大小写不敏感 -
_cs:大小写敏感 -
_bin:二进制比较
七、最全开发选型指南(直接照着用)
7.1 数值类型怎么选
- 状态 / 是否删除 / 性别 → TINYINT
- 普通 ID / 计数 → INT
- 超大 ID / 分布式 ID → BIGINT
- 金额 / 价格 / 财务 → DECIMAL
- 经纬度 / 科学计算 → DOUBLE
7.2 字符串怎么选
- 长度固定 → CHAR
- 长度不固定、需索引 → VARCHAR
- 文章 / 详情 / 不检索 → TEXT
- 单选状态 → ENUM
- 多选标签 → SET
7.3 日期怎么选
- 只存日期 → DATE
- 完整业务时间 → DATETIME
- 自动更新时间 → TIMESTAMP
- 只存年份 → YEAR
八、全文总结(极简版)
- 建表先定类型,类型决定性能、空间、安全
- 整数选合适大小,不要一律 INT
- 钱必须用 DECIMAL
- 固定长度用 CHAR,变长用 VARCHAR
- 能 VARCHAR 不用 TEXT
- 日期不要用字符串,用 MySQL 原生日期类型
- ENUM/SET 极快极省空间,适合固定选项
这一篇就是 MySQL 数据类型最全、最细、最贴近教材、最适合实战的完整版手册,不管是学习、面试、建表都够用。

总结
以上就是今天要讲的内容,本文简单记录了数据结构学习内容,仅作为一份简单的笔记使用,大家根据注释理解,您的点赞关注收藏就是对小编最大的鼓励!