load_file函数
执行select load_file('/home/greatdb/a.txt'); 死活返回null。
捯饬半天,总算搞明白了,要注意以下四点:
1. 跟greatdb 数据库服务的启动用户有关,
3.跟数据库登录用户有关
greatdb -h127.0.0.1 -P3306 -ugreatdb -pgreatdb --binary-as-hex=false
登录数据库greatdb用户 进行测试
3.跟系统变量sercure_file_priv有关
参数文件中设置
查询此系统变量为NULL时,就需要修改。
总之:服务启动使用用户greatdb,切换到操作系统用户greatdb,登录数据库使用greatdb ,设置参数secure_file_priv为空,这样就能成功读取文件。
使用load_file可以将文件插入到数据库字段中。
MySQL数据库插入blob数据方法参考如下:
INSERT INTO `usertest01`.`test_table01` (`id`, `col_varchar`, `col_blob`) VALUES (1, 'sss', UNHEX(HEX('abcd')));
或者
INSERT INTO `usertest01`.`test_table01` (`id`, `col_varchar`, `col_blob`) VALUES (1, 'sss', UNHEX('61626364'));
或者
INSERT INTO `usertest01`.`test_table01` (`id`, `col_varchar`, `col_blob`) VALUES (1, 'sss', UNHEX(61626364));
select hex(col_blob) from `usertest01`.`test_table01`;
MySQL插入插入图片:
select load_file('/var/lib/mysql-files//a.jpg');
select LENGTH(load_file('/var/lib/mysql-files/a.jpg'));
insert into test_table01(id,info,col_blob) values (2,'pic',load_file('/var/lib/mysql-files/a.jpg'));
select @@secure_file_priv, @@max_allowed_packet, LENGTH(load_file('/var/lib/mysql-files/a.jpg'));
-- 如果插入报错 Data too long for column 'xxx' at row 1,可能是目的字段长度不够,需要调整字段类型
alter table test_table01 modify column col_blob MEDIUMBLOB DEFAULT NULL COMMENT 'BLOB测试字段';
说明:
HEX()函数:将一个字符串或数字转换为十六进制格式的字符串
UNHEX()函数:把十六进制格式的字符串转化为二进制的数据
select hex('abcd');
-- 结果为 61626364;
select unhex('61626364');
或者
select unhex(61626364);
-- 结果为 abcd
load_file 函数使用的条件和限制:
1,若没有加载成功会返回空(NULL)
2,必须设置参数 secure_file_priv,加载的文件必须需要放在该参数指定的目录
3,load的文件的大小(LENGTH)不能大于 max_allowed_packet
4,相关查询语句:
select @@secure_file_priv, @@max_allowed_packet, LENGTH(load_file('/var/lib/mysql-files/a.jpg'));
-- 我的查询结果:
/var/lib/mysql-files/ 4194304 372840
5,如果报错:SQL 错误 [1406] [22001]: Data truncation: Data too long for column 'col_blob' at row 1
目的表字段类型长度不够,数据超出了字段的最大长度,需要调整目的表字段的长度,我最初设置是BLOB类型,后轮调整为
不同类型的BLOB的长度参考:
TINYBLOB ≈ 255 bytes,
BLOB: 大约 64KB,65535(2^16-1)
MEDIUMBLOB: 大约 16,777,215(2^24–1)
LONGBLOB: 大约 4GB,4,294,967,295(2^32–1)
修改表字段大小:
alter table test_table01 modify column col_blob MEDIUMBLOB DEFAULT NULL COMMENT 'BLOB测试字段';