MySQL中Blob是一个二进制的对象,它是一个可以存储非结构化数据的容器(如图片、视频、文档等),且能容纳不同大小的数据
Mysql中有四种不同的Blob类型:
① TinyBlob类型 最大能容纳255B的数据
② Blob类型 最大能容纳65KB的
③ MediumBlob类型 最大能容纳16MB的数据
④ LongBlob类型 最大能容纳4GB的数据
一、建立测试表,包含blob字段
CREATE TABLE test
(
id INTEGER NOT NULL PRIMARY KEY,
data LONGBLOB
);
二、插入数据
使用 LOAD_FILE函数 插入非结构化数据(图片、视频、文本)
insert into test values(1, LOAD_FILE('/var/lib/mysql-files/a.txt'));
Mysql中使用 LOAD_FILE函数的注意事项:
1,若没有加载成功会返回空(NULL)
2,必须设置参数 secure_file_priv,加载的文件必须需要放在该参数指定的目录
3,load的文件的大小(LENGTH)不能大于 max_allowed_packet
mysql配置 secure_file_priv:
1、可以使用 show variables like 'secure_file_priv' 查看配置参数值
2、secure_file_priv不能使用set global 方式修改,需要再my.ini或my.conf配置文件中修改,重启mysql服务后生效
3、
secure_file_priv 设置值为 NULL 时,表示限制mysqld不允许导入或导出。
secure_file_priv 设置值为 /dir目录时,表示限制mysqld只能在/dir目录中执行导入导出,其他目录不能执行。
secure_file_priv 没有值时,表示不限制mysqld在任意目录的导入导出,不建议这么设置,不安全测试插入十六进制的字节串
insert into test values(2, 0x01020304FFFFFFFF0000000CAACB0000);
测试插入常规字符串和数字数据
insert into test values(3, 'hellworld');
insert into test values(4, 0);
三、查看数据
执行 select * from test;
第一条数据是我们注入的文本信息,可以正常显示
第二条数据是我们插入的十六进制字符串没有正常显示
第三、四条我们插入的常规字符串和数字可以正常显示
这时候需要用到一个hex()
函数来看Blob类型的数据,查询结果如下:
这回第二条数据正常了,可是其他数据为什么又看起来不一样了呢,因为第4条插入语句的中数据0,实际上是被当做字符串存储的,而字符’0’的ASCII码是十进制的48,表示成十六进制就是0x30,也就是上面查到的这样,同理这个打错了的字符串’hellworld’也是这样存储的
HEX()函数:将一个字符串或数字转换为十六进制格式的字符串
UNHEX()函数:把十六进制格式的字符串转化为二进制的数据