精灵巫婆 发表于 2015-1-16 20:12:32

公布用mysql存储二进制数据流

人力成本上的节省,MySQL的用户Spacemonkey实验室的首席执行官MitchPirtle如此表示:“维护MySQL使得你不需要一个年薪15万美元的DBA。克日一项目碰到必要在DB中存储2进制数据流范例文件的成绩,发明经常使用的MySQLAPI都用不了,再研讨,方知有一套专门的API来干这类数据,功效相称壮大的说。
以下即为典范代码---依照申明编译便可用,略加修正便可存储2进制文件

viewplaincopytoclipboardPRint?
/*
mysql数据库存储二进制数据linux

用处:用mysql_stmt_send_long_data()来向blob字段写进2进制数据流.

注重点:必要注重的是bind布局的buffer_type字段,必需与要输出的数据范例符合,
如:只写进一个long数据,则用MYSQL_TYPE_LONG,写进字符流,用MYSQL_TYPE_STRING,
写进2进制数据流,用MYSQL_TYPE_BLOB
详细这个参数各字段的寄义拜见mysql5.0手册

Compile:g++-I/usr/include/mysql-L/usr/lib/mysql-lmysqlclientmysql_test.cpp

筹办事情:
createdatabasetest;
usetest;
CREATETABLE`bintest`(
`id`int(11)NOTNULLdefault0,
`data`blob
)ENGINE=MyISAM;
*/

#include<mysql.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>


#defineINSERT_QUERY"INSERTINTObintest(id,data)VALUES(4,?)"

voidtest()
{
MYSQL_BINDbind;
unsignedlonglength;

charblog_data={0};
memset(blog_data,0x01,sizeof(blog_data));

char*pos=blog_data;
intsize=50;

MYSQL*mysql=mysql_init(NULL);
if(!mysql)return;
if(!mysql_real_connect(mysql,
"192.168.xx.xxx",
"root",
"db_user_name",
"test",
3306,NULL,0))
{
intret=mysql_errno(mysql);
mysql_close(mysql);
return;
}

MYSQL_STMT*stmt=mysql_stmt_init(mysql);
if(!stmt)
{
fprintf(stderr,"mysql_stmt_init(),outofmemory
");
exit(0);
}
if(mysql_stmt_prepare(stmt,INSERT_QUERY,strlen(INSERT_QUERY)))
{
fprintf(stderr,"
mysql_stmt_prepare(),INSERTfailed");
fprintf(stderr,"
%s",mysql_stmt_error(stmt));
exit(0);
}
memset(bind,0,sizeof(bind));
//bind.buffer_type=MYSQL_TYPE_STRING;
//bind.buffer_type=MYSQL_TYPE_LONG;
bind.buffer=blog_data;
//bind.buffer_type=MYSQL_TYPE_TINY;
bind.buffer_type=MYSQL_TYPE_BLOB;
bind.length=&length;
bind.is_null=0;

/*Bindthebuffers*/
if(mysql_stmt_bind_param(stmt,bind))
{
fprintf(stderr,"
parambindfailed");
fprintf(stderr,"
%s",mysql_stmt_error(stmt));
exit(0);
}

intrc=0;
/*Supplydatainchunkstoserver*/
if(mysql_stmt_send_long_data(stmt,0,pos,size))
{
fprintf(stderr,"
send_long_datafailed");
fprintf(stderr,"
%s",mysql_stmt_error(stmt));
exit(0);
}

pos+=size;

/*Supplythenextpieceofdata*/
if(mysql_stmt_send_long_data(stmt,0,pos,size))
{
fprintf(stderr,"
send_long_datafailed");
fprintf(stderr,"
%s",mysql_stmt_error(stmt));
exit(0);
}

/*Now,executethequery*/
if(mysql_stmt_execute(stmt))
{
fprintf(stderr,"
mysql_stmt_executefailed");
fprintf(stderr,"
%s",mysql_stmt_error(stmt));
exit(0);
}
}


intmain()
{
test();
//sleep(1);
return0;
}
MySQL的低成本来自于其简单性吗?它的普及性是由于其低成本吗?其实,在MySQL的最“好”与最“不好”的功能之间没有明显的分界线,但它们组合在一起就形成了一副让我们欣赏的作品。

admin 发表于 2015-1-18 18:40:04

XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!)

只想知道 发表于 2015-1-26 20:14:56

我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力

愤怒的大鸟 发表于 2015-2-4 21:12:01

原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!

小妖女 发表于 2015-2-10 11:47:41

你可以简单地认为适合的就是好,不适合就是不好。

蒙在股里 发表于 2015-3-1 10:53:37

代替了原来VB式的错误判断。比Oracle高级不少。

深爱那片海 发表于 2015-3-10 16:59:07

多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油

乐观 发表于 2015-3-17 09:09:49

相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
页: [1]
查看完整版本: 公布用mysql存储二进制数据流