mysql 存储二进制数据
晚上小研究了下MySQL存储于读取二进制数据的功能。关键步骤为以下三点: 最重要的一点:存储二进制数据的表的类型需要是blob类型(按长度不同分为tiny, media, long)
插入二进制数据时需要利用mysql_real_escape_string函数对数据进行转换
从数据库中读取二进制数据时需要利用mysql_fetch_length函数字段长度,该函数需要在mysql_fetch_row调用后才可以正常获取结果
给出一个用C写的一个存储与读取字段的小例子,写的比较粗犷,见谅哈~ 先来一个插入: 复制代码
int
db_insert_object(void *object, unsigned int objsize)
{
int ret;
char *escape_object = NULL;
char sql[];
unsigned int escape_size = * objsize + ;
int sql_len;
MYSQL *mysql= NULL; /* connnect db */
mysql = mysql_init(NULL);
if( !mysql_real_connect(mysql, SERVER, USER, PASSWD, DATABASE, , NULL, ) ){
goto error1;
} /* convert binary string */
escape_object = (char *)malloc(escape_size);
if( escape_object == NULL ){
goto error1;
}
escape_size = mysql_real_escape_string(mysql, escape_object, (char *)object, objsize); sql_len = sprintf(sql, "insert into task(object) values('%s')", escape_object);
ret = mysql_real_query(mysql, sql, sql_len);
if( ret ){
goto error1;
} free(escape_object);
mysql_close(mysql);
return ; error1:
printf("error: %s\n", mysql_error(mysql));
if( mysql ) mysql_close(mysql);
if( escape_object ) free(escape_object);
return -;
}
复制代码
然后是读取: 复制代码
void *
db_fetch_object()
{
MYSQL *mysql= NULL;
MYSQL_RES *res = NULL;
MYSQL_ROW row;
unsigned long *row_len;
char *object = NULL;
const char *sql = "select object from task limit 1";
unsigned long objsize;
int ret; /* connnect db */
mysql = mysql_init(NULL);
if( !mysql_real_connect(mysql, SERVER, USER, PASSWD, DATABASE, , NULL, ) ){
goto error2;
} /* get object */
ret = mysql_real_query(mysql, sql, strlen(sql));
if( ret ){
goto error2;
} res = mysql_store_result(mysql);
if( res == NULL ){
goto error2;
} /* important */
row = mysql_fetch_row(res);
row_len = mysql_fetch_lengths(res); /* get the object's length */
if( row_len == NULL ){
goto error2;
}
objsize = row_len[];
object = (char*)malloc(objsize);
if( object == NULL ){
goto error2;
} memcpy(object, row[], objsize); mysql_close(mysql);
mysql_free_result(res);
return (void*)object; error2:
printf("error: %s\n", mysql_error(mysql));
if( res ) mysql_free_result(res);
if( mysql ) mysql_close(mysql);
if( object ) free(object);
return NULL;
}
好像还有一种直接点mysql api可以存储二进制数据。
mysql 存储二进制数据的更多相关文章
- python+ mysql存储二进制流的方式
很多时候我们为了管理方便会把依稀很小的图片存入数据库,有人可能会想这样会不会对数据库造成很大的压力,其实大家可以不用担心,因为我说过了,是存储一些很小的图片,几K的,没有问题的! 再者,在这里我们是想 ...
- 数据库中用varbinary存储二进制数据
问题描述:将图片.二进制文件内容等数据存储在数据库中,并能从数据库中取出还原为图片或文件,数据库存储二进制数据用varbinary字段. 分析:由于之前数据库中没有用过varbinary存储数据,首先 ...
- mssql sqlserver 可以存储二进制数据的字段类型详解
转自: http://www.maomao365.com/?p=6738 摘要: 下文将从数据库的数据类型着手,剖析在sqlserver数据库中可以存储二进制数据的数据类型,如下所示: mssql s ...
- mongodb存储二进制数据
mongodb 3.x存储二进制数据并不是以base64的方式,虽然在mongo客户端的查询结果以base64方式显示,请放心使用.下面来分析存储文件的存储内容.base64编码数据会增长1/3成为顾 ...
- python django中使用sqlite3数据库 存储二进制数据ByteArray
在python中使用sqlite3数据库存储二进制流数据ByteArray,在django使用sqlite3数据库时,有时候也要注意最好使用二进制流ByteArray插入字符串. 使用ByteArra ...
- mongodb存储二进制数据的二种方式——binary bson或gridfs
python 版本为2.7 mongodb版本2.6.5 使用mongodb存储文件,可以使用两种方式,一种是像存储普通数据那样,将文件转化为二进制数据存入mongodb,另一种使用gridfs,咱们 ...
- 读取MySQL存储二进制的语音、图片(Blob类型)
/** * 下载语音 * Remarks: * @throws Exception */ public void downloadYuyin() throws Exception { ...
- BLOB类型的字段用于存储二进制数据
MySQL中,BLOB是个类型系列,包括:TinyBlob.Blob.MediumBlob.LongBlob,这几个类型之间的唯一区别是在存储文件的最大大小上不同. MySQL的四种BLOB类型类型 ...
- MYSQL C API : mysql_real_escape_string 二进制数据存储
#include <iostream> #include <string> #include <string.h> #include <mysql.h> ...
随机推荐
- EffectiveJava(24)使用@SuppressWarnings("unchecked")消除非受检警告
-..使用泛型编程时,会遇到许多编译器警告,如:非受检强制转化警告,非受检方法调用警告,非受检普通数组创建警告,费受精转换警告.这次的内容就是遇到这些警告的时候你该怎么办. PS:非受检警告就是代码上 ...
- vue - 认识ora
主要用来实现node.js命令行环境的loading效果,和显示各种状态的图标等... const ora = require('ora'); const spinner = ora('Loading ...
- 用unity3d切割图片
原地址:http://www.cnblogs.com/leng-yuye/archive/2012/05/31/2528148.html 需求:把图片的像素中不为alpha的部分切出来保存成单个图片. ...
- C语言中函数调用过程(如何管理栈空间)
ps:先做草稿,以后有时间再整理并贴图,:) 主要是利用栈底寄存器(ebp).栈顶寄存器(esp)跟eax寄存器(存储返回值)来实现. 假设P调用Q: P() { Q(1,2); } (跟实际情况可能 ...
- python 爬取王者荣耀高清壁纸
代码地址如下:http://www.demodashi.com/demo/13104.html 一.前言 打过王者的童鞋一般都会喜欢里边设计出来的英雄吧,特别想把王者荣耀的英雄的高清图片当成电脑桌面 ...
- 2014秋C++第5周项目1參考-见识刚開始学习的人常见错误
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,实践要求见http://blog.csdn.net/sxhelijian/a ...
- RelativeLayout经常使用属性介绍及实例解说
RelativeLayout是一种相对布局.控件的位置是依照相对位置来计算的.后一个控件在什么位置依赖于前一个控件的基本位置,是布局最经常使用,也是最灵活的一种布局. 下边来看一下他的经常使用属性 这 ...
- Fiddler4插件开发实践
Fiddler4 是一款 巴拉巴拉..... 连接在这:http://www.telerik.com/fiddler 开发文档在这:http://docs.telerik.com/fiddler/Ex ...
- FMDB(一)— 简单介绍
在iOS开发过程中常常会用到数据库方面的操作,但是iOS原生的SQLite API使用起来并不十分友好,对于C语言基础较薄弱的朋友来说.使用起来可能会认为比較不便.于是,一些第三方的对SQLite A ...
- Linux Chrome Tab 标题 乱码
1. 刚装完ubuntu 14.04 英文版, 又装了google chrome 浏览器. 2. 打开chrome浏览器,发现tab也没的标题是乱码: 3. 而系统自带的firefox却没有这个问题, ...