当前位置: 首页 > article >正文

BLOB 是用来存“二进制大文件”的字段类型

BLOB 是用来存“二进制大文件”的字段类型,可以存 0 到 65535 字节的数据,常用来存图片、音频、PDF、Word 等“非文本”内容。

BLOB  0-65535 bytes 二进制形式的长文本数据

✅ 关键词 1:BLOB

  • 全称:Binary Large Object
  • 中文:二进制大对象
  • 作用:专门用来存二进制数据(不是纯文本)

你可以把 BLOB 理解成数据库里的 “U盘”,可以往里塞文件,但不是用来看文字的。


✅ 关键词 2:0 - 65535 bytes

  • 表示:最多能存 65535 字节 = 64KB 的数据。
  • 所以这个 BLOB 类型,也叫:TINYBLOB 或者普通 BLOB

🔸注意:字节 ≠ 字符。一个汉字在 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,是直接压进数据库的!


✅ 哪些东西可以用 BLOB 存?

类型示例
图片.jpg, .png, .webp
音频.mp3, .wav
视频.mp4, .mov
文档.pdf, .docx, .xlsx
序列化对象pickle 文件、模型权重等

✅ BLOB 有几种?

类型最大容量场景
TINYBLOB255 字节很小的二进制,例如图标
BLOB64KB(65535 字节)普通图片、文件
MEDIUMBLOB16MB大点的音视频
LONGBLOB4GB超大视频、模型等

❗提醒:什么时候不要用 BLOB?

虽然 BLOB 很强,但:

  • ❌ 不适合频繁读取(效率低)
  • ❌ 不适合网页直接访问(不能像 URL 一样用)
  • ❌ 文件太大建议放对象存储(如 OSS、S3),数据库只存链接

✅ 总结一句话:

BLOB 是数据库里的“文件柜”,专门存储图片、视频、音频等二进制数据,最多能放 64KB(BLOB 类型本身)。如果你想存一个 PDF、图片、模型文件,都可以用它装起来。

我们来做一个完整实战:上传头像图片(JPG)存进 MySQL 数据库的 BLOB 字段,并能读出来恢复成图片文件 ✅

🧱 场景设定:用户头像上传

你有个 users 表,每个用户上传一张头像图(avatar 字段),你希望直接把图片数据压进数据库。


📄 第一步:创建 SQL 表

CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(100),avatar BLOB  -- 存头像二进制数据(最多64KB)
);

🐍 第二步:Python 插入图片数据

假设你有一张 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.connectorconn = 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()

📌 实战说明

步骤操作说明
1open(..., "rb") 读图得到二进制内容
2用 SQL INSERT 插入 BLOB数据直接压进数据库
3读出 avatar得到二进制 -> 再写成文件

🧠 常见问题

问题解决方案
图片太大存不下(超 64KB)改字段为 MEDIUMBLOB
插入失败:类型错误确保传的是 bytes 类型
存储效率慢、访问不快文件存 OSS、数据库存链接更合理

🧪 Bonus:加个图片类型字段

你也可以扩展一下表结构:

ALTER TABLE users ADD COLUMN avatar_type VARCHAR(20);

然后上传时存 MIME 类型,比如 image/jpeg,以后从数据库恢复图片时还能动态判断类型。

http://www.lryc.cn/news/2401390.html

相关文章:

  • 5.Declare_Query_Checking.ipynb
  • 【知识点】第7章:文件和数据格式化
  • NetSuite Bundle - Dashboard Refresh
  • AI+3D 视觉重塑塑料袋拆垛新范式:迁移科技解锁工业自动化新高度
  • 智慧赋能:移动充电桩的能源供给革命与便捷服务升级
  • 【项目实践】SMBMS(Javaweb版)(三)登出、注册、注销、修改
  • 斐波那契数列------矩阵幂法
  • 【Go语言基础【四】】局部变量、全局变量、形式参数
  • DeepSeek 赋能车路协同:智能交通的破局与重构
  • RabbitMQ 的异步化、解耦和流量削峰三大核心机制
  • Ubuntu 25.10 将默认使用 sudo-rs
  • Maven​​ 和 ​​Gradle​​ 依赖管理的详细说明及示例,涵盖核心概念、配置方法、常见问题解决和工具对比。
  • 【Web应用】若依框架:基础篇21二次开发-页面调整
  • 【 java 基础知识 第一篇 】
  • CVE-2020-17518源码分析与漏洞复现(Flink 路径遍历)
  • Excel表格批量下载 CyberWin Excel Doenlaoder 智能编程-——玄武芯辰
  • 可编辑PPT | 基于大数据中台新能源智能汽车应用解决方案汽车大数据分析与应用解决方案
  • 【统计方法】基础分类器: logistic, knn, svm, lda
  • AtomicInteger原子变量和例题
  • simulink有无现成模块可以实现将三个分开的输入合并为一个[1*3]的行向量输出?
  • k8s集群安装坑点汇总
  • Selenium 和playwright 使用场景优缺点对比
  • 从 Stdio 到 HTTP SSE,在 APIPark 托管 MCP Server
  • Python训练营打卡Day43
  • Mysql锁及其分类
  • RabbitMQ实用技巧
  • Postgresql源码(146)二进制文件格式分析
  • spring ai mcp 和现有业务逻辑如何结合,现有项目用的是spring4.3.7
  • 【设计模式-4.11】行为型——解释器模式
  • 【已解决】MACOS M4 芯片使用 Docker Desktop 工具安装 MICROSOFT SQL SERVER