BLOB 是用来存“二进制大文件”的字段类型,可以存 0 到 65535 字节的数据,常用来存图片、音频、PDF、Word 等“非文本”内容。
BLOB 0-65535 bytes 二进制形式的长文本数据
BLOB
你可以把 BLOB 理解成数据库里的 “U盘”,可以往里塞文件,但不是用来看文字的。
0 - 65535 bytes
注意:字节 ≠ 字符。一个汉字在 UTF-8 编码里占 3 个字节。
比如你有一张 JPG 图片,大小是 42KB:
CREATE TABLE images (
id INT PRIMARY KEY,
name VARCHAR(255),
data BLOB -- 存二进制的图片内容
);
然后你用程序把图片读成二进制内容:
# Python 插入 BLOB 图片
with open("dog.jpg", "rb") as f:
binary_data = f.read()
cursor.execute("INSERT INTO images (id, name, data) VALUES (%s, %s, %s)",
(1, "cute dog", binary_data))
✅ BLOB 存的是图片的“原始文件内容”,不是链接、不是 base64,是直接压进数据库的!
类型 | 示例 |
---|---|
图片 | .jpg, .png, .webp |
音频 | .mp3, .wav |
视频 | .mp4, .mov |
文档 | .pdf, .docx, .xlsx |
序列化对象 | pickle 文件、模型权重等 |
类型 | 最大容量 | 场景 |
---|---|---|
TINYBLOB |
255 字节 | 很小的二进制,例如图标 |
BLOB |
64KB(65535 字节) | 普通图片、文件 |
MEDIUMBLOB |
16MB | 大点的音视频 |
LONGBLOB |
4GB | 超大视频、模型等 |
虽然 BLOB 很强,但:
BLOB
是数据库里的“文件柜”,专门存储图片、视频、音频等二进制数据,最多能放 64KB(BLOB 类型本身)。如果你想存一个 PDF、图片、模型文件,都可以用它装起来。
我们来做一个完整实战:上传头像图片(JPG)存进 MySQL 数据库的 BLOB 字段,并能读出来恢复成图片文件 ✅
你有个 users
表,每个用户上传一张头像图(avatar
字段),你希望直接把图片数据压进数据库。
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(100),
avatar BLOB -- 存头像二进制数据(最多64KB)
);
假设你有一张 avatar.jpg
头像,代码如下:
import mysql.connector
# 连接 MySQL 数据库
conn = mysql.connector.connect(
host='localhost',
user='root',
password='your_password',
database='your_db'
)
cursor = conn.cursor()
# 读取图片为二进制数据
with open("avatar.jpg", "rb") as f:
avatar_data = f.read()
# 插入用户数据
sql = "INSERT INTO users (username, avatar) VALUES (%s, %s)"
cursor.execute(sql, ("alice", avatar_data))
conn.commit()
print("✅ 插入成功!")
cursor.close()
conn.close()
import mysql.connector
conn = mysql.connector.connect(
host='localhost',
user='root',
password='your_password',
database='your_db'
)
cursor = conn.cursor()
# 查询头像数据
sql = "SELECT avatar FROM users WHERE username = %s"
cursor.execute(sql, ("alice",))
result = cursor.fetchone()
if result:
avatar_data = result[0]
# 写入新图片文件
with open("output_avatar.jpg", "wb") as f:
f.write(avatar_data)
print("✅ 已恢复头像为 output_avatar.jpg")
else:
print("❌ 没找到用户")
cursor.close()
conn.close()
步骤 | 操作 | 说明 |
---|---|---|
1 | 用 open(..., "rb") 读图 |
得到二进制内容 |
2 | 用 SQL INSERT 插入 BLOB |
数据直接压进数据库 |
3 | 读出 avatar 列 |
得到二进制 -> 再写成文件 |
问题 | 解决方案 |
---|---|
图片太大存不下(超 64KB) | 改字段为 MEDIUMBLOB |
插入失败:类型错误 | 确保传的是 bytes 类型 |
存储效率慢、访问不快 | 文件存 OSS、数据库存链接更合理 |
你也可以扩展一下表结构:
ALTER TABLE users ADD COLUMN avatar_type VARCHAR(20);
然后上传时存 MIME 类型,比如 image/jpeg
,以后从数据库恢复图片时还能动态判断类型。