仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 606|回复: 7
打印 上一主题 下一主题

[学习教程] 公布用mysql存储二进制数据流

[复制链接]
精灵巫婆 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 20:12:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
人力成本上的节省,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[1];
unsignedlonglength;

charblog_data[100]={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[0].buffer_type=MYSQL_TYPE_STRING;
//bind[0].buffer_type=MYSQL_TYPE_LONG;
bind[0].buffer=blog_data;
//bind[0].buffer_type=MYSQL_TYPE_TINY;
bind[0].buffer_type=MYSQL_TYPE_BLOB;
bind[0].length=&length;
bind[0].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的闪回技术还是细粒度不够。可惜!
小妖女 该用户已被删除
5#
发表于 2015-2-10 11:47:41 | 只看该作者
你可以简单地认为适合的就是好,不适合就是不好。
蒙在股里 该用户已被删除
6#
发表于 2015-3-1 10:53:37 | 只看该作者
代替了原来VB式的错误判断。比Oracle高级不少。
深爱那片海 该用户已被删除
7#
发表于 2015-3-10 16:59:07 | 只看该作者
多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
乐观 该用户已被删除
8#
发表于 2015-3-17 09:09:49 | 只看该作者
相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 07:57

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表