好的!下面是《MySQL 系列之数据类型(String)》的详细讲解,内容涵盖字符串类型的分类、特点、使用场景、存储机制和注意事项,适合开发者和数据库设计人员深入学习与实践。


MySQL 系列之数据类型(String 字符串类型)


目录

  1. 字符串类型概览
  2. CHAR 与 VARCHAR 的区别
  3. TEXT 系列类型详解
  4. BLOB 系列类型详解
  5. ENUM 与 SET 枚举类型
  6. 字符集与排序规则(Collation)
  7. 存储机制对比与性能注意事项
  8. 实际使用建议与案例
  9. 常见问题与误区

1. 字符串类型概览

MySQL 中的字符串类型主要包括以下几类:

类型简介最大长度
CHAR(n)固定长度字符串255 字符以内
VARCHAR(n)可变长度字符串最长 65535 字节(受限于行大小)
TEXT 系列大型文本数据类型最多 4GB(依类型而异)
BLOB 系列二进制大对象,存储文件、图片等最多 4GB(依类型而异)
ENUM单值枚举类型最多 65535 个成员
SET多选枚举类型(集合)最多 64 个成员

2. CHAR 与 VARCHAR 的区别

特性CHARVARCHAR
长度固定
存储效率高,节省空间碎片灵活,但存在碎片
存储格式定长填充空格变长+额外字节存储长度
读取性能稳定快速与实际长度相关
适用场景身份证、MD5等定长字段名称、地址等不定长字段

示例:

CREATE TABLE user (
  id INT,
  code CHAR(10),
  name VARCHAR(50)
);

3. TEXT 系列类型详解

TEXT 类型用于存储大量文本,如评论、文章内容:

类型最大长度占用空间说明
TINYTEXT255 字节1 字节长度前缀
TEXT65,535 字节2 字节长度前缀
MEDIUMTEXT16,777,215 字节3 字节长度前缀
LONGTEXT4,294,967,295 字节4 字节长度前缀
  • 无法设置默认值
  • 不支持全文索引(InnoDB 5.6 之前)
  • 不能用于主键或唯一索引列

4. BLOB 系列类型详解

BLOB 用于存储二进制数据,如图像、音频等:

类型最大长度特点
TINYBLOB255 字节存储小二进制
BLOB65KB常用于普通文件或图片
MEDIUMBLOB16MB可用于音视频片段
LONGBLOB4GB可用于完整视频、大型文件
  • 不区分字符集,不进行排序或比较
  • 占用较大磁盘空间,尽量外部存储+路径引用

5. ENUM 与 SET 枚举类型

ENUM

  • 列值只能从指定列表中选择一个
  • 占用空间小(1~2 字节)
  • 索引效率高
  • 不推荐频繁变更定义内容

示例:

gender ENUM('male', 'female', 'other')

SET

  • 可从指定集合中选择多个
  • 最多支持 64 个成员
  • 用位图存储,效率较高,但不易阅读
hobbies SET('music', 'sports', 'reading')

6. 字符集与排序规则(Collation)

  • 常用字符集:
    • utf8mb4:推荐,支持 Emoji
    • latin1:旧系统常见,西欧语种
  • 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') 进行逻辑判断

参考资料