sql中存储二进制数据最常用的是BLOB类型,mysql分TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB,postgresql用BYTEA,SQL Server用VARBINARY(MAX);须参数化操作字节数组,避免乱码;大文件应存外部存储,数据库仅留URL。

SQL中存储二进制数据,最常用也最直接的方式就是使用BLOB(Binary Large Object)类型字段。它专为保存图片、音频、pdf、压缩包等非文本内容而设计,不是用来存字符串或数字的。
BLOB字段的基本类型与选择
不同数据库对BLOB有细分,选错会影响最大容量和性能:
- MySQL:TINYBLOB(≤255字节)、BLOB(≤64KB)、MEDIUMBLOB(≤16MB)、LONGBLOB(≤4GB)——根据文件平均大小选,别一上来就用LONGBLOB
- PostgreSQL:用BYTEA类型,没有子类,单值上限约1GB,大文件建议配合Large Object API处理
- SQL Server:旧版用IMAGE(已弃用),现在统一用VARBINARY(MAX),支持2GB以内数据
插入和读取BLOB的实际写法
不能像普通字段那样直接拼字符串,必须用参数化方式防止截断或乱码:
- 插入时:用?(占位符)+ 预编译语句,把字节数组(如java的byte[]、python的bytes、C#的byte[])作为参数传入
- 读取时:查出来是字节数组,不是字符串;若误用getString()会得到乱码或异常
- 示例(MySQL + JDBC):ps.setBytes(1, fileBytes); 和 byte[] data = rs.getBytes(“photo”);
别把BLOB当文件服务器用
直接存在数据库里看着方便,但有明显代价:
- 数据库体积膨胀快,备份/恢复变慢,主从同步延迟升高
- 无法利用cdn、http缓存、断点续传等文件服务优势
- 并发下载多时,数据库连接和I/O压力陡增
- 推荐做法:BLOB只存小图标、用户头像(≤100KB);大文件存磁盘或对象存储(如S3、MinIO),数据库里只留URL或路径
基本上就这些。用对类型、写对代码、想清架构,BLOB就能稳稳干活。