1.简介

MySQL 中 BLOB 类型的字段用于存储二进制数据,例如图片,音乐等,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。

根据 Eric Raymond 的说法,处理 BLOB 的主要思想就是让文件处理器(如数据库管理器)不去理会文件是什么,而是关心如何去处理它。但也有专家强调,这种处理大数据对象的方法是一把双刃剑,它有可能引发一些问题,如存储的二进制文件过大,会使数据库的性能下降。在数据库中存放体积较大的多媒体对象就是应用程序处理 BLOB 的典型例子。

在 MySQL 中,BLOB 是个类型系列,包括: TINYBLOBBLOBMEDIUMBLOBLONGBLOB,这几个类型之间的唯一区别就是存储文件的最大大小不同。

MySQL 的四种 BLOB 类型可存储的最大值:

类型 大小
TINYBLOB 255B
BLOB 65K
MEDIUMBLOB 16M
LONGBLOB 4G

2.代码示例

以 Discuz!X 中存取系统缓存配置为例,介绍下如何存取 BLOB 类型数据。

2.1 创建数据库

DROP TABLE IF EXISTS `syscache`;
CREATE TABLE `syscache`(
    `cname` VARCHAR(32) NOT NULL,
    `data` MEDIUMBLOB NOT NULL,
    PRIMARY KEY (`cname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

2.2 写入数据

我们将要写入的数据进行序列化后写入到数据库。
这里用到了 think-orm 库,主要封装了数据库操作,可以使用 composer 进行安装:

composer require topthink/think-orm

$setting = [
    'accessEmail' => '',
    'bbRules' => 0,
    'ecCredit' => [
        'maxCreditsPerMonth' => 6,
        'rank' => [
            1 => 4,
            2 => 11,
            3 => 41,
            4 => 91,
            5 => 151
        ]
    ]
];

Db::table('syscache')
    ->insert([
        'cname' => 'setting',
        'data' => serialize($setting)
    ]);

2.3 读取数据

$data = Db::table('syscache')
    ->where('cname', '=', 'setting')
    ->find();
var_dump(unserialize($data['data']));

即可打印出存入的数组。

2.4 数据库字段值

如果导出数据库数据,会发现,BLOB 存储的是形如 0x613XXX 的十六进制数据。