首页 >> 基础教程
mysql中blob 和 text 有什么区别?
在 MySQL 中,BLOB
和 TEXT
都是用于存储大量数据的数据类型,但它们在存储内容类型、字符处理和行为特性上有本质区别。以下是详细对比:
核心区别总结表
特性 | BLOB (Binary Large Object) | TEXT |
---|---|---|
存储内容 | 二进制数据(原始字节) | 文本数据(字符) |
典型用途 | 图片、音频、视频、加密数据、压缩文件 | 文章、日志、JSON/XML、代码 |
字符集处理 | 无字符集,直接存储字节 | 关联字符集(如 utf8mb4) |
排序规则 | 按字节值排序(二进制排序) | 按字符集排序规则排序 |
最大长度 | 与 TEXT 相同(65KB~4GB) | 与 BLOB 相同(65KB~4GB) |
尾部空格处理 | 保留所有字节(包括 0x00 ) | 根据字符集处理尾部空格 |
比较操作 | 区分大小写('A' != 'a' ) | 取决于排序规则(可能不区分大小写) |
详细解析
1. 存储内容类型
BLOB
存储原始二进制数据(字节序列):
- 图片文件(JPEG/PNG)
- 音频/视频文件
- 加密数据或压缩文件(ZIP)- 序列化对象(如 Python pickle)
- 不适合存储文本(会丢失字符集信息)TEXT
存储字符串文本(字符序列):
- 长篇文章或日志
- JSON/XML 数据
- HTML/CSS/JS 代码
- 产品描述或用户评论
- 不能存储二进制文件(会损坏数据)
2. 字符集与编码
特性 | BLOB | TEXT |
---|---|---|
字符集 | 无字符集概念 | 关联表的字符集(如 utf8mb4 ) |
存储方式 | 直接存储原始字节 | 按字符集编码存储(如 UTF-8) |
数据转换 | 插入/读取时不转换 | 插入/读取时自动转换字符集 |
乱码风险 | 无(保持二进制原样) | 字符集不匹配时可能乱码 |
3. 子类型与最大长度
两种类型均有四种子类型,支持相同范围的长度:
类型 | 最大长度 | 存储开销 | 典型场景 |
---|---|---|---|
TINYBLOB/TINYTEXT | 255 字节 | 1 字节 | 短文本/小图标 |
BLOB/TEXT | 65,535 字节 (64KB) | 2 字节 | 普通文章/中等图片 |
MEDIUMBLOB/MEDIUMTEXT | 16,777,215 字节 (16MB) | 3 字节 | 长文档/高清图片 |
LONGBLOB/LONGTEXT | 4,294,967,295 字节 (4GB) | 4 字节 | 视频文件/整本书内容 |
注意:实际可用长度受 max_allowed_packet
参数限制(默认 4MB)
4. 排序与比较行为
BLOB
排序基于字节数值(二进制顺序)
比较区分大小写:
'A'
(0x41) ≠'a'
(0x61)保留所有字节(包括
0x00
和尾部空格)TEXT
排序基于字符集排序规则(如
utf8mb4_general_ci
)比较可能不区分大小写:
'A' = 'a'
(取决于排序规则)尾部空格处理根据字符集而定
性能与使用建议
优先用
TEXT
的场景:存储日志、JSON 或 XML 数据
需要文本搜索(配合
FULLTEXT
索引)涉及字符集转换的场景
优先用
BLOB
的场景:存储加密数据或序列化对象
需要精确字节匹配(如哈希值校验)
处理非文本文件(如图片)
通用建议:
避免在表中存超大文件:超过 1MB 的文件建议存文件系统,数据库只存路径
谨慎使用
SELECT *
:大字段会显著拖慢查询索引限制:只能对列的前缀建索引(如
INDEX (text_col(100))
)
MySQL 8.0+ 的
JSON
类型比TEXT
更适合存储结构化文本,支持原生查询和验证。
最新文章
InnoDB 和 MyISAM 主要有什么区别?2025-07-06
mysql存储引擎应该怎么选择?2025-07-06
mysql的几种存储引擎2025-07-06
MySQL 的段区页行2025-07-06
一条更新语句是如何执行的?2025-07-06
mysql中一条查询语句是如何执行的?2025-07-02
MySQL基础架构及执行流程解析2025-07-02
MySQL SQL语法树解析过程详解2025-07-02
mysql中SQL 的隐式数据类型转换?2025-07-01
MySQL 第 3-10 条记录怎么查?2025-06-30