直接把文件放入数据库中比较适合小文件,方便管理,比如头像图片和声音,如果是较大型的文件建议不要直接存进数据库,而是放在服务器,把文件索引放在数据库。

MYSQL 中有个数据对象是 BLOB,即 Binary Large Object,顾名思义也就是二进制大型数据对象,用来记录二进制的数据,它有 4 种类型,分别是:tinyblob(255B)、blob(65KB)、mediumblob(16MB)、longblob(4GB)。

我在数据库中创建了一张 images 表,如下图:

先把用到的头文件和预处理写一下:

#include

#include

#include

#include

#include

#pragma comment(lib, "libmysql.lib")

#define BYTE unsigned char

#define FILE_MAX_SIZE (65 * 1024) /*文件最大65KB*/

接下来的任务就是怎么把数据记录到 img 字段,我用C语言写了个函数,函数接受文件路径:

void insert(char *path)

{

FILE *fp;

BYTE *img, data;

long cnt = 0;

MYSQL mysql;

char *sql;

/*读取文件*/

fp = fopen(path, "rb");

if (!fp)

{

printf("读取文件失败\n");

return;

}

img = malloc(FILE_MAX_SIZE); //分配65KB的内存

memset(img, FILE_MAX_SIZE, 0);

while (!feof(fp))

{

fread(&data, 1, 1, fp);

if (data == '\0') //将结束字符转义

{

img[cnt++] = '\\';

img[cnt++] = '0';

continue;

}

if (data == '\'' || data == '\\' /*|| data == '\"'*/) //这些字符也要转义

{

img[cnt++] = '\\';

}

img[cnt++] = data;

if (cnt == FILE_MAX_SIZE)

{

printf("文件超过65KB\n");

free(img);

fclose(fp);

return;

}

}

img[cnt] = '\0';

fclose(fp);

/*操作数据库*/

if (NULL == mysql_init(&mysql))

{

printf("初始化数据库失败\n");

return;

}

if (NULL == mysql_real_connect(&mysql, "localhost", "root", "password", "test", 0, NULL, 0))

{

printf("连接数据库失败\n");

return;

}

sql = malloc(126 + FILE_MAX_SIZE);

memset(sql, 126 + FILE_MAX_SIZE, 0);

sprintf(sql, "INSERT INTO images (img) VALUES ('%s')", img);

if (0 != mysql_real_query(&mysql, sql, strlen(sql)))

{

printf("执行SQL语句出错\n");

mysql_close(&mysql);

free(sql);

free(img);

return;

}

mysql_close(&mysql);

free(sql);

free(img);

printf("插入成功\n");

}

从以上代码可以看出整个过程是将文件以二进制形式读出,然后再执行 SQL 语句。

下面我要将文件从数据库中读取出来,存放本地,该函数结束文件路径和在数据库中的 id 字段:

void peek(char *filename, int id)

{

MYSQL mysql;

FILE *fp;

char sql[126];

MYSQL_RES *res;

MYSQL_ROW row;

long *length;

/*操作数据库*/

if (NULL == mysql_init(&mysql))

{

printf("初始化数据库失败\n");

return;

}

if (NULL == mysql_real_connect(&mysql, "localhost", "root", "password", "test", 0, NULL, 0))

{

printf("连接数据库失败\n");

return;

}

sprintf(sql, "SELECT img FROM images WHERE id=%d", id);

if (0 != mysql_real_query(&mysql, sql, strlen(sql)))

{

printf("执行SQL语句出错\n");

}

res = mysql_store_result(&mysql);

if (NULL == res)

{

printf("数据库中无结果\n");

mysql_close(&mysql);

}

row = mysql_fetch_row(res);

length = mysql_fetch_lengths(res); //得到img字段数据的长度

mysql_close(&mysql);

/*写入文件*/

fp = fopen(filename, "wb");

if (!fp)

{

mysql_free_result(res);

mysql_close(&mysql);

printf("创建文件失败\n");

return;

}

fwrite(row[0], 1, length[0], fp); //这里千万不能用strlen计算长度,因为文件中可能有很多结束标志字符'\0'

fclose(fp);

mysql_free_result(res);

mysql_close(&mysql);

printf("读取成功\n");

} 我开始被 strlen 的问题搞得晕头转向,心想不用 strlen 那我再用什么得到长度呢,还好后来找到了 mysql_fetch_lengths 这个函数。

c mysql如何获取照片_MYSQL数据库存取图片等文件(C语言)相关推荐

  1. 安卓 mysql读取图片路径_android开发之数据库存取图片

    Android数据库中存取图片通常使用两种方式,一种是保存图片所在路径,二是将图片以二进制的形式存储(sqlite3支持BLOB数据类型).对于两种方法的使用,好像第二种方法不如第一种方法更受程序员欢 ...

  2. delphi使用ADO在sql数据库存取图片的方法

    delphi使用ADO在sql数据库存取图片的方法 新手参考,老鸟绕行 我一直不认为能把代码写的和天书一样的程序员是好的程序员,那不过是因为我真的对delphi也就是略懂皮毛,太深了看不懂. 网上查询 ...

  3. mysql fetchall获取不到数据_解决pymysql cursor.fetchall() 获取不到数据的问题

    1.之前的写法(不报错): data = cursor.fetchall() data_name = data[0]['task_type'] 2.简洁的写法(报错): data = cursor.f ...

  4. python读取nc文件并转换成csv_使用Python截取nc文件数据保存到CSV文件-Go语言中文社区...

    问题要求: 编写一个函数完成以下任务:截取经度在23°N-40°N,纬度在118°E-131°E范围内各属性不同深度的数据,使用Python中合适的数据结构将截取的数据保存到同名CSV文件中.(nc文 ...

  5. mysql数据库存表情报错_mysql数据库存表情报错

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  6. mysql双向同步读写_mysql数据双向同步

    即读写操作在两台服务器上进行,每台服务器即主也是从.当其中的任何一台服务器收到操作请求时,其进行相应的数据变化,并把变化的数据复制到另一台服务器中. 4 数据同步实现 4.1mysql数据双向同步 4 ...

  7. mysql状态监听_Mysql数据状态监听探讨(攒人品)_MySQL

    bitsCN.com 年会前攒人品,你懂得! 应用场景: 长时间运行程序,需要几乎整表查询Mysql,还得在可容忍范围内响应数据变化. 方案一:通过Mysql自带的表更新时间 查询方案:SELECT ...

  8. mysql 用户表结构设计_MySQL数据表结构设计

    1表结构 每个表的内容: image image image image image image image image 2表关系 天蓝色代表表中有唯一索引. image 3数据表索引与时间戳 ima ...

  9. php mysql只获取一条数据_php mysql 查询只返回第一条数据

    php mysql 查询只返回第一条数据 $search = mysql_query("select * from `info`"); $search = mysql_fetch_ ...

最新文章

  1. Android 多线程-----AsyncTask详解
  2. 通过日期获取一周的那一天
  3. Socket简介及客户端服务器连接实例
  4. 【推荐】会开发和懂开发的区别
  5. CSS3的calc()使用
  6. NorFlash与NandFlash
  7. ip变换器苹果系统_加密锁能为高铁做什么?铁路电力变换器系统告诉您
  8. 破51项国际榜单纪录!解读华为云擎天架构调度求解引擎
  9. matlab freqs函数用法,Matlab freqs 函数
  10. 游戏找不到DirectX的解决方法
  11. 关于计算机病毒的试题,计算机病毒测试题.doc
  12. 惯量比多少合适_惯量比折算问题
  13. BASH脚本基础:使用md5sum命令生成消息摘要指纹与验证
  14. Html提交表单的制作
  15. Python3 多种方式爬取最新30期双色球历史数据存入csv
  16. 部署Unbound实现DNS服务
  17. 计算机上没有端口DOT4,dot4_001端口
  18. 形容词,名词记忆(四):al后缀常用词
  19. 解决TypeError: Converting circular structure to JSON
  20. 职业生涯自我规划五步

热门文章

  1. php与nginx链接,Nginx与PHP的交互
  2. 【NIO】IO多路复用
  3. oracle log block size,案例:Oracle无法启动报错ORA-00218: block size 0 重建控制文件
  4. channelinboundhandler中都包含了哪一类的方法_数据仓库、数据集市、数据湖、数据中台到底有什么区别?都得做吗?...
  5. linux挂载硬盘_一篇文章带你了解 linux 如何进行挂载
  6. 浅谈Python flask框架浅析
  7. excel2007无法加载mysql_Excel2007中进行无法安装加载项的解决方法
  8. Git的工作区与暂存区
  9. Java单元测试的意义_单元测试重要意义及方法介绍
  10. android md日期选择器,移动端日期选择