Mysql LONGTEXT 类型存储大文件(二进制也可以) (修改+调试+整理)_Mysql

#include "stdafx.h"
//是前一篇的姊妹篇
//代码来自网络,我学习整理了一下,测试通过,下面的参数
//需要设置为你自己的
//在DBMS中线要创建数据库www,table www,file字段数据类型用LONGTEXT即可测试
//测试文件c:\\test.iso,你可以找任何一个文件修改为即可,我找的是一个exe程序,修改为test.iso而已
//最大测试过加入文件大小为650M(一个正真的iso文件)
//注意:还要修改my.ini文件中的max_allowed_packet字段,我设置的是

复制代码 代码如下:

//max_allowed_packet = 1024M
//#define host "localhost" //mysql server
//#define username "root"
//#define password "674800"
//#define database "test"
//int port = 3306;
#include <Winsock2.h>
#include <stdio.h>
#include <mysql.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define host "localhost" //mysql server
#define username "root"
#define password "674800"
#define database "www"
int port = 3306;
#pragma comment(lib,"libmysql.lib")
//得到文件的大小(字节数)
int get_file_size(char *path, off_t *size)
{
struct stat file_stats;
if(stat(path, &file_stats))
return -1;
*size = file_stats.st_size;
return 0;
}
int main(int argc, char *argv[])
{
char *filename=NULL;
off_t size;
MYSQL *conn=NULL;
MYSQL_RES *res_set=NULL;
MYSQL_ROW row;
MYSQL_FIELD *field=NULL;
int i, flag;
char *sql; //sql语句
FILE *fp;
char *buf;
int n=256;
char *end;
unsigned long *length;
/* if (argc != 2)
{
printf("Usage: %s srcfile\n", argv[0]);
exit(1);
}
*/
filename = "c:\\test.iso";
if ((get_file_size(filename, &size)) == -1) //得到文件的大小
{
perror("get file size" );
exit(1);
}
if ((buf = (char *)malloc(sizeof(char)*(size+1))) == NULL)
{
perror("malloc buf" );
exit(1);
}
if ((fp = fopen(filename, "rb" )) == NULL) //读文件
{
perror("fopen file" );
exit(1);
}
if ((n = fread(buf, 1, size, fp)) < 0) //读文件失败
{
perror("fread file" );
exit(1);
}
sql = (char *)malloc(sizeof(char)*n*2+256); //2n+1+strlen(other sql)
if (sql == NULL)
{
perror("malloc sql" );
exit(1);
}
conn = mysql_init(NULL);//生产一个mysql对象
if (conn == NULL)
{
printf("init mysql, %s\n", mysql_error(conn));
exit(1);
}
if ((mysql_real_connect(conn, host, username, password, database, port, NULL, 0)) == NULL) //连接服务器
{
printf("connect mysql, %s\n", mysql_error(conn));
exit(1);
}
strcpy(sql, "insert into www(id, name, file) values(NULL, 'peter', " );
end = sql;
end += strlen(sql); //point sql tail
//convert NUL(ASCII 0)、'\n'、'\r'、'\''、'''、'"'和Control-Z and so on
*end++ = '\'';
end += mysql_real_escape_string(conn, end, buf, n);
*end++ = '\'';
*end++ = ')';
flag = mysql_real_query(conn, sql, (unsigned int)(end-sql));
if (flag != 0)
{
printf("insert failed, %s\n", mysql_error(conn));
exit(1);
}
if ((mysql_real_query(conn, "SELECT file FROM www where id=1", 31)) != 0)
{
printf("insert failed, %s\n", mysql_error(conn));
exit(1);
}
res_set = mysql_store_result(conn);
fclose(fp);
fp = NULL;
fp = fopen("c:\\123.iso", "wb" );
while ((row = mysql_fetch_row(res_set)) != NULL)
{
length = mysql_fetch_lengths(res_set);
for (i=0; i<mysql_num_fields(res_set); i++)
{
fwrite(row[0], 1, length[0], fp);
//printf("%s\n",row[0]);
}
}
fclose(fp);
mysql_close(conn);
free(sql);
free(buf);
sql = NULL;
return 0;
}

运行结果:

时间: 2024-10-26 07:29:16

Mysql LONGTEXT 类型存储大文件(二进制也可以) (修改+调试+整理)_Mysql的相关文章

Mysql LONGBLOB 类型存储二进制数据 (修改+调试+整理)_Mysql

在DBMS中线要创建数据库test,table bintest,data字段数据类型用LONGBLOB即可测试 //测试文件c:\\test.iso,你可以找任何一个文件修改为即可,我找的是一个exe程序,修改为test.iso而已 //最大测试过加入文件大小为650M(一个正真的iso文件) //注意:还要修改my.ini文件中的max_allowed_packet字段,我设置的是 复制代码 代码如下: //max_allowed_packet = 1024M //#define host "

大文件 b树 存储-大文件操作利用B树实现的具体原理

问题描述 大文件操作利用B树实现的具体原理 我们做一个图书馆管理系统,要求是书的信息存储在一个文件中,这个文件需要满足2G的大小,也就是说一个文件中可以同时放下几百万本书籍的信息,通过网上查资料,很多是说用B树来实现,可是我想不明白的是建立B树的索引时索引的指针指向的记录地址怎么确定,也就是说在一个文件里我要查找一本书的信息,需要分批读进内存来进行查找,如果使用了B树,怎么实现查找呢,它是直接可以根据索引找到该书在文件中的位置吗? 解决方案 在设计应用软件的时候直接设计数据存储的物理结构,这种做

MySQL数值类型存储长度及范围

  MySQL设置数值型列时,需要考虑到数值的范围,所以,数值类型就必然需要考虑,以下为MySQL数值类型的存储长度,当然存储长度基本决定着其值域范围.本文节选自MySQL官方网站,仅做汇总摘要整理. 一.TINYINT 1个字节存储,范围有符号-128-127,无符号0-255.还有一个类型是BOOL型,相当于TINYINT(1). 二.SMALLINT 2个字节存储,范围带符号的范围是-32768到32767.无符号的范围是0到65535. 三.MEDIUMINT 3个字节存储,范围带符号的

oracle+jsp中blob类型存储大文本问题解决方法

oracle 存储大文本一直是一个棘手的问题. 一.存数据库: <%@page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %><%//定义变量java.sql.Connection conn; //数据库连接对象String sql;long id;ResultSet rs;

PHP快速按行读取CSV大文件的封装类分享

 这篇文章主要介绍了一个PHP快速按行读取CSV大文件的封装类,这个类同时也适用于其它体积较大的文本文件,需要的朋友可以参考下 CSV大文件的读取已经在前面讲述过了(PHP按行读取.处理较大CSV文件的代码实例),但是如何快速完整的操作大文件仍然还存在一些问题.   1.如何快速获取CSV大文件的总行数?   办法一:直接获取文件内容,使用换行符进行拆分得出总行数,这种办法对小文件可行,处理大文件时不可行: 办法二:使用fgets一行一行遍历,得出总行数,这种办法比办法一好一些,但大文件仍有超时

PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)_php实例

CSV大文件的读取已经在前面讲述过了(PHP按行读取.处理较大CSV文件的代码实例),但是如何快速完整的操作大文件仍然还存在一些问题. 1.如何快速获取CSV大文件的总行数? 办法一:直接获取文件内容,使用换行符进行拆分得出总行数,这种办法对小文件可行,处理大文件时不可行:办法二:使用fgets一行一行遍历,得出总行数,这种办法比办法一好一些,但大文件仍有超时的可能:办法三:借助SplFileObject类,直接将指针定位到文件末尾,通过SplFileObject::key方法获取总行数,这种办

PHP读取CSV大文件导入数据库的示例

对于数百万条数据量的CSV文件,文件大小可能达到数百M,如果简单读取的话很可能出现超时或者卡死的现象. 为了成功将CSV文件里的数据导入数据库,分批处理是非常必要的. 下面这个函数是读取CSV文件中指定的某几行数据:  代码如下 复制代码 /**  * csv_get_lines 读取CSV文件中的某几行数据  * @param $csvfile csv文件路径  * @param $lines 读取行数  * @param $offset 起始行数  * @return array  * */

二进制-mysql 数据库中 blob 类型存储数字 无法正常插入更新

问题描述 mysql 数据库中 blob 类型存储数字 无法正常插入更新 事情是这样的,在Mysql数据库中有个字段是blob类型的,里面存放的是 8字节无符号整数, 类似于 33454690,45672389,这样一类数值,我使用select 语句select conv(hex(bc.DataTimeStamp) ,16,10) as DataTimestamp 是可以正常显示的,现在我想把 33454690 这个数字 查找出来,加1,变为 33454691,再存放回去. 使用语句 inser

《MySQL技术内幕:InnoDB存储引擎第2版》——3.6 InnoDB存储引擎文件

3.6 InnoDB存储引擎文件 之前介绍的文件都是MySQL数据库本身的文件,和存储引擎无关.除了这些文件外,每个表存储引擎还有其自己独有的文件.本节将具体介绍与InnoDB存储引擎密切相关的文件,这些文件包括重做日志文件.表空间文件.3.6.1 表空间文件InnoDB采用将存储的数据按表空间(tablespace)进行存放的设计.在默认配置下会有一个初始大小为10MB,名为ibdata1的文件.该文件就是默认的表空间文件(tablespace file),用户可以通过参数innodb_dat