所以,阁下刚才所问的问题,实际上你可以把它输出到文件系统中,然后在数据库中保存这个文件的地址。
BLOB介绍BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。BLOB是一
个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。根据Eric Raymond的
说法,处理BLOB的主要思想就是让文件处理器(如数据库管理器)不去理会文件是什么,而是关心如何去处理它。但也有专家强调,这种处理大数据对象的方法是把双
刃剑,它有可能引发一些问题,如存储的二进制文件过大,会使数据库的性能下降。在数据库中存放体积较大的多媒体对象就是应用程序处理BLOB的典型例子。
mysql BLOB类型
MySQL中,BLOB是个类型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储文件的最大大小上不同。
MySQL的四种BLOB类型
类型 大小(单位:字节)
TinyBlob 最大 255
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G
在DBMS中线要创建数据库test,tablebintest,data字段数据类型用LONGBLOB即可测试
//测试文件c:\\test.iso,你可以找任何一个文件修改为即可,我找的是一个exe程序,修改为test.iso而已
//最大测试过加入文件大小为650M(一个正真的iso文件)
//注意:还要修改my.ini文件中的max_allowed_packet字段,我设置的是
复制代码
代码如下:
//max_allowed_packet
=
1024M
//#define
host
"localhost"
//mysql
server
//#define
username
"root"
//#define
password
"674800"
//#define
database
"test"
//int
port
=
3306
//
Mysql3.cpp
:
Defines
the
entry
point
for
the
console
application.
//
#include
"stdafx.h"
#include
<Winsock2.h>
#include
<mysql.h>
#include
<string.h>
#include
<stdio.h>
#include
<stdlib.h>
#include
<sys/types.h>
#include
<sys/stat.h>
#include
<fcntl.h>
#pragma
comment(lib,"libmysql.lib")
#define
INSERT_QUERY
"INSERT
INTO
bintest(id,
data)
VALUES(NULL,
?)"
#define
host
"localhost"
//mysql
server
#define
username
"root"
#define
password
"674800"
#define
database
"test"
int
port
=
3306
int
get_file_size(char
*path,
off_t
*size)
{
struct
stat
file_stats
if(stat(path,
&file_stats))
return
-1
*size
=
file_stats.st_size
return
0
}
void
test()
{
MYSQL_BIND
bind[1]
unsigned
long
length
char*
pos
=
NULL
off_t
size
FILE*
fp
char*
filename
=
"c:\\test.iso"
if
((get_file_size(filename,
&size))
==
-1)
//得到文件的大小
{
perror("get
file
size"
)
exit(1)
}
if
((pos
=
(char
*)malloc(sizeof(char)*(size+1)))
==
NULL)
{
perror("malloc
buf"
)
exit(1)
}
if
((fp
=
fopen(filename,
"rb"
))
==
NULL)
//读文件
{
perror("fopen
file"
)
exit(1)
}
if
((fread(pos,
1,
size,
fp))
<
0)
//读文件失败
{
perror("fread
file"
)
exit(1)
}
MYSQL
*mysql
=
mysql_init(NULL)
//mysql
初始化
if
(!mysql)
return
if
(!mysql_real_connect(mysql,host,username,password,"test",port,NULL,0))//链接服务器
{
int
ret
=
mysql_errno(mysql)
mysql_close(mysql)
return
}
MYSQL_STMT
*stmt
=
mysql_stmt_init(mysql)
if
(!stmt)
{
fprintf(stderr,
"
mysql_stmt_init(),
out
of
memory\n")
exit(0)
}
if
(mysql_stmt_prepare(stmt,
INSERT_QUERY,
strlen(INSERT_QUERY)))
{
fprintf(stderr,
"\n
mysql_stmt_prepare(),
INSERT
failed")
fprintf(stderr,
"\n
%s",
mysql_stmt_error(stmt))
exit(0)
}
memset(bind,
0,
sizeof(bind))
//bind[0].buffer_type=
MYSQL_TYPE_STRING
//bind[0].buffer_type
=
MYSQL_TYPE_LONG
bind[0].buffer
=
pos
//bind[0].buffer_type
=
MYSQL_TYPE_TINY
bind[0].buffer_type
=
MYSQL_TYPE_BLOB
bind[0].length=
&length
bind[0].is_null=
0
/*
Bind
the
buffers
*/
if
(mysql_stmt_bind_param(stmt,
bind))
{
fprintf(stderr,
"\n
param
bind
failed")
fprintf(stderr,
"\n
%s",
mysql_stmt_error(stmt))
exit(0)
}
int
rc
=0
/*
Supply
data
in
chunks
to
server
*/
if
(mysql_stmt_send_long_data(stmt,0,
pos,
size))
{
fprintf(stderr,
"\n
send_long_data
failed")
fprintf(stderr,
"\n
%s",
mysql_stmt_error(stmt))
exit(0)
}
//
pos
+=
size
/*
Supply
the
next
piece
of
data
*/
if
(mysql_stmt_send_long_data(stmt,0,
pos,
size))
{
fprintf(stderr,
"\n
send_long_data
failed")
fprintf(stderr,
"\n
%s",
mysql_stmt_error(stmt))
exit(0)
}
/*
Now,
execute
the
query
*/
if
(mysql_stmt_execute(stmt))
{
fprintf(stderr,
"\n
mysql_stmt_execute
failed")
fprintf(stderr,
"\n
%s",
mysql_stmt_error(stmt))
exit(0)
}
}
int
main()
{
test()
//sleep(1)
return
0
}
运行结果:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)