MySQL一列超过4GB(即LONGBLOB存不下)怎么办

MySQL一列超过4GB(即LONGBLOB存不下)怎么办,第1张

一般情况下,超过几十M的文件都直接放文件系统中而非放在数据库中了,数据库中只是存放该个文件在文件系统中的地址引用而已。

所以,阁下刚才所问的问题,实际上你可以把它输出到文件系统中,然后在数据库中保存这个文件的地址。

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,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

}

运行结果:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8571519.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-18
下一篇 2023-04-18

发表评论

登录后才能评论

评论列表(0条)

保存