扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
mysql中有2种字段类型来存储二进制原始数据。
成都创新互联公司服务项目包括泗阳网站建设、泗阳网站制作、泗阳网页制作以及泗阳网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,泗阳网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到泗阳省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
1、binary和varbinary,适合存储少量的二进制数据
2、blob适合存储大量的数据
输入时可以用INSERT INTO table (name) VALUE( x“0123456789ABCDEF“ )
这样的16进制串,也可以JDBC的setBlob等方法输入。
在DBMS中线要创建数据库test,table
bintest,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;
}
运行结果:
一般很少将二进制的数据,存到数据库里一般是加二年制的数据转换成指定的文件保存在,嗯文件目录里然后再,数据库里存储对应的存储地址,或者是,蒋,数据转换成其他类型存入到数据库。
像图片这种东西一般都不是直接保存在数据库的,你图片上传了之后,会有个上传后的图片保存路径,你就把这个图片保存的路径给保存到数据库就可以了,你在取的时候直接那这个路径,去找到对应的图片就可以了;图片上传工具有配置上传后保存路径的地方,你把传的图片重命名一下,如果有多张图片,记得名字别重复就行!
把你要保存的数据转换为BYTE[]然后保存
下面是读取文件然后保存
stream = new FileStream(control.Text, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
bReader = new BinaryReader(stream);
MySQLParameter par = new MySQLParameter("?FieldName", System.Data.DbType.Binary);
par.Value = bReader.ReadBytes((int)stream.Length);
command.Parameters.Add(par);
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流