MySQL 中 BLOB 类型的字段用于存储二进制数据,例如图片,音乐等,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。
根据 Eric Raymond 的说法,处理 BLOB 的主要思想就是让文件处理器(如数据库管理器)不去理会文件是什么,而是关心如何去处理它。但也有专家强调,这种处理大数据对象的方法是一把双刃剑,它有可能引发一些问题,如存储的二进制文件过大,会使数据库的性能下降。在数据库中存放体积较大的多媒体对象就是应用程序处理 BLOB 的典型例子。
在 MySQL 中,BLOB 是个类型系列,包括: TINYBLOB
、BLOB
、MEDIUMBLOB
、LONGBLOB
,这几个类型之间的唯一区别就是存储文件的最大大小不同。
MySQL 的四种 BLOB 类型可存储的最大值:
类型 | 大小 |
---|---|
TINYBLOB | 255B |
BLOB | 65K |
MEDIUMBLOB | 16M |
LONGBLOB | 4G |
以 Discuz!X 中存取系统缓存配置为例,介绍下如何存取 BLOB 类型数据。
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;
我们将要写入的数据进行序列化后写入到数据库。
这里用到了 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)
]);
$data = Db::table('syscache')
->where('cname', '=', 'setting')
->find();
var_dump(unserialize($data['data']));
即可打印出存入的数组。
如果导出数据库数据,会发现,BLOB 存储的是形如 0x613XXX
的十六进制数据。