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> ...
随机推荐
- subscription group permisson
- js 上传图片进行回显
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- hibernate学习系列-----(9)hibernate对集合属性的操作之Map集合篇
照旧,先新建一个StudentMap.java实体类,将hobby属性使用map集合接口来存放: package com.joe.entity; import java.util.Map; publi ...
- Python——描述符(descriptor)解密
本文由 极客范 - 慕容老匹夫 翻译自 Chris Beaumont.欢迎加入极客翻译小组,同我们一道翻译与分享.转载请参见文章末尾处的要求. Python中包含了许多内建的语言特性,它们使得代码简洁 ...
- Java基于注解和反射导入导出Excel
代码地址如下:http://www.demodashi.com/demo/11995.html 1. 构建项目 使用Spring Boot快速构建一个Web工程,并导入与操作Excel相关的POI包以 ...
- lucene: nDocs must be > 0查询异常解决
nDocs must be > 0 // 函数search(query,filter,n),其中query是查询条件,filter是过滤器,n查询数量,异常消息意思就是n参数的值必须大于 ...
- Oracle undo 表空间管理 (摘DAVID)
Oracle 的Undo有两种方式: 一是使用undo 表空间,二是使用回滚段. 我们通过 undo_management 参数来控制使用哪种方式,如果设为auto,就使用UNDO 表空间,这时必须要 ...
- Spring 常用类
一.拦截器 public class SysInteceptor implements HandlerInterceptor { /** * 最后执行,可用于释放资源 */ @Override pub ...
- zendstdio的智能提示功能
在项目的include的那个地方邮寄,在addsource file 然后指向TP类库的文件夹,刷新项目即可有智能提示
- linux系统之free命令详解
total used free shared buffers cached Mem: -/+ buffers/cache: Swap: 上面是free命令的执行结果,下面我来详细说说其中的含义: Me ...