好的!下面是《MySQL 系列之数据类型(String)》的详细讲解,内容涵盖字符串类型的分类、特点、使用场景、存储机制和注意事项,适合开发者和数据库设计人员深入学习与实践。
MySQL 系列之数据类型(String 字符串类型)
目录
- 字符串类型概览
- CHAR 与 VARCHAR 的区别
- TEXT 系列类型详解
- BLOB 系列类型详解
- ENUM 与 SET 枚举类型
- 字符集与排序规则(Collation)
- 存储机制对比与性能注意事项
- 实际使用建议与案例
- 常见问题与误区
1. 字符串类型概览
MySQL 中的字符串类型主要包括以下几类:
类型 | 简介 | 最大长度 |
---|---|---|
CHAR(n) | 固定长度字符串 | 255 字符以内 |
VARCHAR(n) | 可变长度字符串 | 最长 65535 字节(受限于行大小) |
TEXT 系列 | 大型文本数据类型 | 最多 4GB(依类型而异) |
BLOB 系列 | 二进制大对象,存储文件、图片等 | 最多 4GB(依类型而异) |
ENUM | 单值枚举类型 | 最多 65535 个成员 |
SET | 多选枚举类型(集合) | 最多 64 个成员 |
2. CHAR 与 VARCHAR 的区别
特性 | CHAR | VARCHAR |
---|---|---|
长度固定 | 是 | 否 |
存储效率 | 高,节省空间碎片 | 灵活,但存在碎片 |
存储格式 | 定长填充空格 | 变长+额外字节存储长度 |
读取性能 | 稳定快速 | 与实际长度相关 |
适用场景 | 身份证、MD5等定长字段 | 名称、地址等不定长字段 |
示例:
CREATE TABLE user (
id INT,
code CHAR(10),
name VARCHAR(50)
);
3. TEXT 系列类型详解
TEXT 类型用于存储大量文本,如评论、文章内容:
类型 | 最大长度 | 占用空间说明 |
---|---|---|
TINYTEXT | 255 字节 | 1 字节长度前缀 |
TEXT | 65,535 字节 | 2 字节长度前缀 |
MEDIUMTEXT | 16,777,215 字节 | 3 字节长度前缀 |
LONGTEXT | 4,294,967,295 字节 | 4 字节长度前缀 |
- 无法设置默认值
- 不支持全文索引(InnoDB 5.6 之前)
- 不能用于主键或唯一索引列
4. BLOB 系列类型详解
BLOB 用于存储二进制数据,如图像、音频等:
类型 | 最大长度 | 特点 |
---|---|---|
TINYBLOB | 255 字节 | 存储小二进制 |
BLOB | 65KB | 常用于普通文件或图片 |
MEDIUMBLOB | 16MB | 可用于音视频片段 |
LONGBLOB | 4GB | 可用于完整视频、大型文件 |
- 不区分字符集,不进行排序或比较
- 占用较大磁盘空间,尽量外部存储+路径引用
5. ENUM 与 SET 枚举类型
ENUM
- 列值只能从指定列表中选择一个
- 占用空间小(1~2 字节)
- 索引效率高
- 不推荐频繁变更定义内容
示例:
gender ENUM('male', 'female', 'other')
SET
- 可从指定集合中选择多个
- 最多支持 64 个成员
- 用位图存储,效率较高,但不易阅读
hobbies SET('music', 'sports', 'reading')
6. 字符集与排序规则(Collation)
- 常用字符集:
utf8mb4
:推荐,支持 Emojilatin1
:旧系统常见,西欧语种
- Collation 控制排序方式:
utf8mb4_general_ci
:不区分大小写utf8mb4_bin
:区分大小写
建议:统一使用 utf8mb4
和 utf8mb4_unicode_ci
排序规则
7. 存储机制对比与性能注意事项
CHAR
更适用于高频查询且长度固定字段VARCHAR
更灵活,适用于大多数场景TEXT/BLOB
存储在行外,查询时需二次读取,影响性能- 尽量避免为
TEXT
做 LIKE ‘%xxx%’ 查询,可配合全文索引(MySQL 5.6+)优化
8. 实际使用建议与案例
场景 | 建议类型 |
---|---|
用户名/邮箱 | VARCHAR(100) |
身份证号 | CHAR(18) |
文章内容 | TEXT |
头像图片/二进制文件 | BLOB 或路径VARCHAR |
性别/状态(固定枚举) | ENUM |
多标签、多兴趣分类 | SET |
9. 常见问题与误区
- VARCHAR最大长度不是65535字符,而是65535字节(受行限制影响)
- TEXT 不支持默认值、主键或唯一索引
- CHAR 若比较时忘记
RTRIM()
,可能导致误差 - ENUM 顺序是值而非文字含义,避免使用
ENUM('admin', 'user')
进行逻辑判断
参考资料
- MySQL官方文档 – String Types
- 《高性能MySQL 第3版》
- 阿里巴巴Java开发手册(数据库设计部分)
发表回复