C、C++写二进制数据到mysql的Blob字段/插入images

2023-10-29

-- 引子--

由于调试需要,需直接往数据库里写入二进制数据。本来这些数据是由上层软件来写的,用的是C#。为了熟悉C语言的数据库操作,还是决定用C来写这段调试代码。

概况:

表名:Task

涉及的字段及属性:

NumDestint(11) 用于存储目标数目

destIDs: blob 用于存储具体的目标ID

废话不多说,入正题。



--二进制数据写入--

二进制数据最为常见的就是图片等一些文件信息。虽然我这里不是这类型信息,但确实是二进制数据。

具体步骤:

1、 定义一个buffer(如数组)来存储sql语句

2、 把涉及到二进制数据之前的sql语句添加到buffer中,可用sprintfstrcpy等。

3、 mysql_real_escape_string()函数添加二进制数据到buffer中。

4、 加上剩余的sql语句,形成完整的sql语句。

5、 利用mysql_real_query()函数来执行sql语句。

具体代码如下:


#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>
#include <stdint.h>
#include <string.h>

int main(int argc, char *argv[])
{
MYSQL mysql;
char sql[256], *end;
int index, i;
uint32_t *destIDs;

if(argc != 2)
{
printf("enter error!\n");
exit(1);
}
index = atoi(argv[1]);
printf("index: %d\n", index);
destIDs = (uint32_t *)malloc(index * sizeof(uint32_t));
if(destIDs == NULL)
printf("malloc error\n");
for(i=0; i<index; i++)
destIDs[i] = i + 1;
mysql_init(&mysql);
if(!(mysql_real_connect(&mysql, "localhost", "root", "654321", "dbname", 0, NULL, 0)))
{
fprintf(stderr, "Couldn't connect to engine!\n%s\n", mysql_error(&mysql));
perror("");
exit(1);
}

sprintf(sql, "INSERT INTO Task(NumDest, DestIDs) VALUE (%u, ", index );
end = sql + strlen(sql);
*end++ = '\'';
end += mysql_real_escape_string(&mysql, end,(char *)destIDs, index*sizeof(uint32_t));
*end++ = '\'';
*end++ = ')';

printf("end - sql: %d\n", (unsigned int)(end - sql));

if(mysql_real_query(&mysql, sql, (unsigned int)(end - sql)))
{
fprintf(stderr, "Query failed (%s)\n", mysql_error(&mysql));
exit(1);
}
mysql_close(&mysql);
exit(0);
#endif
return 0;
}




--读取二进制文件--

对于二进制文件的读取,也类似。

具体步骤:

1,构造查询字串.

2,执行mysql _query查询(网上有说用mysql_real_query,未实验)

3,mysql_store_result存储结果.

4,mysql_fetch_row取出一条记录处理.

具体代码如下:


#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <mysql/mysql.h>
#include <string.h>

int main(void)
{
int ret, i;
char sql[256];
MYSQL mysql;
MYSQL_RES *result;
MYSQL_ROW row;
uint32_t *destIDs, *temp;
unsigned int destNum = 0;

mysql_init(&mysql);
if(!(mysql_real_connect(&mysql, "localhost", "root", "654321", "dbname", 0, NULL, 0)))
{
fprintf(stderr, "Couldn't connect to engine!\n%s\n",
mysql_error(&mysql));
perror("");
exit(1);
}

sprintf(sql, 
"SELECT TaskID, NumDest, DestIDs FROM Task");
ret = mysql_query(&mysql, sql);
if(ret != 0)
{
printf( "Failed to query task table: %s\n",
mysql_error(&mysql));
return ret;
}

result = mysql_store_result(&mysql);
if(result == NULL)
{
ret = mysql_errno(&mysql);
printf( "Failed to store query result from task table:%s\n",
mysql_error(&mysql));
return ret;
}

if((row = mysql_fetch_row(result)) != NULL)
{
sscanf(row[1], "%u", &destNum);

destIDs = (uint32_t *)malloc(destNum * sizeof(uint32_t));
if(destIDs == NULL)
{
printf("malloc error!\n");
exit(1);
}
memcpy(destIDs, row[2], destNum * sizeof(uint32_t)); 
}

mysql_free_result(result);

printf("destNum: %d\n", destNum);
temp = destIDs;
for(i=0; i<destNum; i++)
{
printf("destIDs[%d]:%d\t", i+1, *temp++);
}

return ret;
}


由于我这里可以根据NumDest获取到二进制的长度,所以不用再用函数去获取。

据网上信息,获取二进制信息长度应该这样:“如果取出来的是二进制的数据,要确定它的长度,必须要用mysql_fetch_lengths函数取得其长度”


int num_fields = mysql_num_fields(result);
unsigned long *lengths = mysql_fetch_lengths(result);
for(i=0; i<num_fields; i++)
printf("Column: %u\t %lu bytes\n", i+1, lengths[i]);
destIDs = (uint32_t *)malloc(lengths[2]);
if(destIDs == NULL)
{
printf("malloc error!\n");
exit(1);
}
memcpy(destIDs, row[2], lengths[2]);





取二进制数据:

一样的sql语句,查询出来即可。只不过二进制数据是个数据块,需要得到数据块的大小和数据指针。

bool CMySqlAccess::GetBinaryField(int nCol,char* &pDataOut,int& nDataLen)
{
if (m_ItemMySqlRow[nCol] != NULL)
{
unsigned long *FieldLength = mysql_fetch_lengths(m_pMySqlResult);
nDataLen = (int)FieldLength[nCol];
pDataOut = (char*)(m_ItemMySqlRow[nCol]);
return true;
}
else
{
return false;
}
}

像通常一样查询后,得到结果集,然后得到第nCol列结果,返回二进制指针结果和二进制长度。返回后必须立马处理或者存储一份。否则mysql将数据销毁,指针所指数据则无效了。

存二进制数据:

mysql语句接受的sql语句都是string,以'\0'结尾的。如果冒然插入二进制数据到sql语句中,要么报错,要么存储错误。此处可以通过mysql提供的函数将数据转换一下即可。

char* CMySqlAccess::ConvertBinaryToString(char* pBinaryData,int nLen)
{
static char s_BinaryData[10240];
mysql_real_escape_string(m_pMySqlConn,s_BinaryData,pBinaryData,nLen);
return s_BinaryData;
}
上面这个函数只能单线程使用啊,将一块二进制数据转换为mysql可识别的string数据。这样就直接可以通过mysql的sql语句insert,update来对blob数据进行更新和插入了,sql语句用法不变。

用例:

std::ostringstream strSQL;
strSQL<<"INSERT INTO "<<m_strTableName<<"(roleid,playerdata,dynamicdata) VALUES("<<dwDBRoleID
<<",'"<<m_pDBAccess->ConvertBinaryToString(pData,nLen)<<"','')";
assert(m_pDBAccess);
m_pDBAccess->ExecuteSQL(strSQL.str());

playerdata是blob二进制类型,pData是指向一个结构体的指针,nLen是结构体的大小。

上面就可以实现二进制的存储了。

 

方法二:

上面的方法,你会发现,你每次都需要转换数据,传指针,传大小等一系列复杂操作,是不是顺序很混乱,过程很繁杂。mysql也为你提供了另外一种方法,那就是MYSQL_BIND。将数据操作统一化,统一麻烦化。mysqlbind是一个结构体,根据个人不同需求填充各个数据成员可以存储任意类型数据,当然包括blob。

bool CMySqlAccess::SetBinaryField(std::string& strCondition,void* pDataIn,int nDataLen)
{
if( ! mysql_stmt_prepare( m_pMySqlStmt, strCondition.c_str(), strCondition.length() ) )
{
memset(&m_MySqlBind,0,sizeof(MYSQL_BIND));
m_MySqlBind.buffer_type = MYSQL_TYPE_BLOB;
(*m_MySqlBind.length) = nDataLen;
memcpy(m_MySqlBind.buffer,pDataIn,nDataLen);
if(!mysql_stmt_bind_param(m_pMySqlStmt, (MYSQL_BIND *)&m_MySqlBind))
{
if(!mysql_stmt_execute(m_pMySqlStmt)) 
{
return true;
}
}
}
int nRes=GetDBErrorCode();
CLogOutStream errLog(crazy::ERROR_LEVEL,THIS_CLASS_NAME);
errLog<<"MySql Query Failed:\""<<strCondition<<"\" ,ErrorCode:"<<nRes<<crazy::logEnd;
return false;
}

这个是对某一列blob数据进行存操作。pDataIn和nDataLen分别是一个struct结构体和结构体大小。填充完毕mysqlbind之后即可对数据库二进制列进行存储了。可能你会问,没有指定哪一列呢,对。哪一列是在strCondition语句里面的,这是一个预处理语句。在预处理语句里面,有一个符号: ? 。问号,问号的位置代表了mysqlbind数据对应的位置。

INSERT INTO test_table(date_field, time_field, timestamp_field) VALUES(?,?,?)

上面这个语句,有3个问号,三个问号分别对应test_table的三列.每个问号呢又对应一个mysqlbind数据结构。那么我们在mysql_stmt_bind_param函数调用时,就应该传入一个mysql_bind 数组。MYSQL_BIND m_MySqlBind[3].

填充整个数组数据,即对应三个问号内容。

用例:
MYSQL_BIND bind[3];
MYSQL_STMT *stmt;

strmov(query, "INSERT INTO test_table(date_field, time_field, timestamp_field) VALUES(?,?,?");
//初始化stmt
stmt = mysql_stmt_init(mysql);
//预处理语句
mysql_stmt_prepare(mysql, query, strlen(query));
//初始化参数
bind[0].buffer_type= MYSQL_TYPE_DATE;
bind[0].buffer= (char *)&ts;
bind[0].is_null= 0;
bind[0].length= 0;
bind[1]= bind[2]= bind[0];
//绑定参数123
mysql_stmt_bind_param(stmt, bind);
//执行预处理mysql语句
mysql_stmt_execute(stmt);

还没看懂就个人去看mysql文档了,其实里面讲得很清楚,只要找对几个函数,就可以把search出来了

转自:http://blog.chinaunix.net/uid-23842323-id-2656614.html
Reference:http://topic.csdn.net/u/20090316/11/ac003f13-d1da-49a5-b12f-90e57cbe5ac9.html


FROM: http://www.cppblog.com/Daywei0123/archive/2012/07/05/181479.html


================================================================================



Inserting images into MySQL database

Some people prefer to put their images into the database, some prefer to keep them on the file system for their applications. Technical difficulties arise when we work with millions of images. Images are binary data. MySQL database has a special data type to store binary data called BLOB (Binary Large Object).

mysql> describe images;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(11)    | NO   | PRI |         |       |
| data  | mediumblob | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

This is the table, that we will use in our example. It can be created by the following SQL statement.

create table images(id int not null primary key, data mediumblob);
#include <my_global.h>
#include <mysql.h>

int main(int argc, char **argv)
{
  MYSQL *conn;

  int len, size;
  char data[1000*1024];
  char chunk[2*1000*1024+1];
  char query[1024*5000];

  FILE *fp;

  conn = mysql_init(NULL);
  mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);

  fp = fopen("image.png", "rb");
  size = fread(data, 1, 1024*1000, fp);

  mysql_real_escape_string(conn, chunk, data, size);

  char *stat = "INSERT INTO images(id, data) VALUES('1', '%s')";
  len = snprintf(query, sizeof(stat)+sizeof(chunk) , stat, chunk);

  mysql_real_query(conn, query, len);

  fclose(fp);
  mysql_close(conn);
}

In this example, we will insert one image into the images table. The image can be max 1 MB.

 fp = fopen("image.png", "rb");
 size = fread(data, 1, 1024*1000, fp);

Here we open the image and read it into the data array.

 mysql_real_escape_string(conn, chunk, data, size);

Binary data can obtain special characters, that might cause troubles in the statements. We must escape them. The mysql_real_escape_string()puts the encoded data into the chunk array. In theory, every character might be a special character. That's why the chunk array two times as big as the data array. The function also adds a terminating null character.

 char *stat = "INSERT INTO images(id, data) VALUES('1', '%s')";
 len = snprintf(query, sizeof(stat)+sizeof(chunk) , stat, chunk);

These two code lines prepare the MySQL query.

 mysql_real_query(conn, query, len);

Finally, we execute the query.

Selecting images from MySQL database

In the previous example, we have inserted an image into the database. In the following example, we will select the inserted image back from the database.

#include <my_global.h>
#include <mysql.h>

int main(int argc, char **argv)
{
  MYSQL *conn;
  MYSQL_RES *result;
  MYSQL_ROW row;

  unsigned long *lengths;
  FILE *fp;

  conn = mysql_init(NULL);
  mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);

  fp = fopen("image.png", "wb");

  mysql_query(conn, "SELECT data FROM images WHERE id=1");
  result = mysql_store_result(conn);

  row = mysql_fetch_row(result);
  lengths = mysql_fetch_lengths(result);

  fwrite(row[0], lengths[0], 1, fp);
  mysql_free_result(result);

  fclose(fp);
  mysql_close(conn);
}

In this example, we will create an image file from the database.

 fp = fopen("image.png", "wb");

We open a file for writing.

 mysql_query(conn, "SELECT data FROM images WHERE id=1");

We select an image with id 1.

 row = mysql_fetch_row(result);

The row contains raw data.

 lengths = mysql_fetch_lengths(result);

We get the length of the image.

 fwrite(row[0], lengths[0], 1, fp);

We create the image file using the fwrite() standard function call. 



FROM: http://blog.chinaunix.net/uid-18989614-id-2798644.html


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C、C++写二进制数据到mysql的Blob字段/插入images 的相关文章

  • 使用唯一索引删除重复项

    我在两个表字段 A B C D 之间插入 相信我已经在 A B C D 上创建了唯一索引以防止重复 然而我以某种方式简单地对这些做了一个正常的索引 因此插入了重复项 这是2000万条记录的表 如果我将现有索引从普通索引更改为唯一索引 或者只
  • 无法使用 Django 应用程序从容器连接到 MySQL docker 容器

    当我尝试从运行 Django 应用程序的 docker 容器连接到运行 MySQL 的容器时 出现以下错误 django db utils OperationalError 2003 Can t connect to MySQL serve
  • mySQL MATCH 跨多个表

    我有一组 4 个表 我想对其进行搜索 每个都有全文索引 查询可以使用每个索引吗 CREATE TABLE categories id int 5 unsigned NOT NULL auto increment display order
  • 使用按位函数查询 BIT 字段时,MySQL 不使用索引

    我的 MySQL 表中有一个 BIT 类型的字段 我想使用位值存储记录的状态 例如 1 status1 2 status2 4 status3 8 status4 每条记录可以同时具有多种状态 对于 status1 和 status3 该值
  • 单行的总和值?

    我有一个 MySQL 查询 它返回由一系列 1 和 0 组成的单行 它用于进度条指示器 我现在在代码中对它进行求和 但我尝试对查询中的值求和 并意识到我无法使用 SUM 因为它们有很多列 但只有一行 有没有办法可以在查询中自动求和 就像这样
  • 如何以最少的查询次数获取帖子列表和关联标签

    我的表格结构如下 标签 更多的是一个类别 id 标签名称 描述 slug POSTS ID 标题 网址 邮戳 id idPost idTag USERS ID 用户名 userSlug VOTES id idPost idUser 每个帖子
  • 当“修复表”查询在 mysql 中不起作用时该怎么办?

    我收到此错误 表的存储引擎不支持修复 当我尝试使用查询修复表时repair table tbl college master 表是 innodb 类型 但我不知道我收到此错误 See 手册 http dev mysql com doc re
  • 如何在 phpmyadmin 中创建 MySQL 触发器

    我想在 MySQL 中创建一个触发器 我运行以下命令 mysql gt delimiter mysql gt CREATE TRIGGER before insert money BEFORE INSERT ON money gt FOR
  • Mysql innoDB 不断崩溃[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的数据库 mysql 服务器不断崩溃 重新启动 我不知道该怎么办 我不断在 dbname org err 文件中收到以下内容 13120
  • 查询中列的顺序重要吗?

    当从 MySQL 表中选择列时 与表中的顺序相比 选择列的顺序是否会影响性能 不考虑可能覆盖列的索引 例如 您有一个包含行 uid name bday 的表 并且有以下查询 SELECT uid name bday FROM table M
  • MySQL 使用 ALTER IGNORE TABLE 出现重复错误

    我的 MySQL 中有一个有重复项的表 我尝试删除重复项并保留一项 我没有主键 我可以通过以下方式找到重复项 select user id server id count as NumDuplicates from user server
  • MYSQL 区分大小写的 utf8 搜索(使用 hibernate)

    我的登录表具有 utf8 字符集和 utf8 排序规则 当我想要检查用户名并检索该特定用户名的其他信息时 hql 查询会为我提供小写和大写相同的结果 我应该如何处理适用于案例的 HQL 查询 我使用 Mysql 5 和 java hiber
  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • 将古吉拉特语文本插入 MySQL 表会产生垃圾字符和不可读的文本

    我有三个 MySQL 表 我正在向其中插入古吉拉特语内容 当我插入两个表时 它们插入得很好并且可读 但在一个表中 它显示垃圾字符 不可读的文本 我怎样才能解决这个问题 MySQL 有每个表的字符集设置 http dev mysql com
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • 免费 PHP 登录库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Bugzilla 中分离客户端的基本权限

    我正在尝试配置一个 Bugzilla 实例 这将允许我的客户登录并为其正在开发 维护的网站提交错误 例如 我创建了 2 个名为 TestProject TestProject2 的产品和一个名为 TestClient 的用户 我想要实现的是
  • 在 PHP 字符串中格式化 MySQL 代码

    是否有任何程序 IDE 可以在 PHP 字符串中格式化 MySQL 代码 例如 我使用 PHPStorm IDE 但它无法做到这一点 它对 PHP 和 MYSQL 执行此操作 但不适用于 php 字符串内的 MYSQL 我已准备好使用新的
  • 如何从shell脚本自动登录MySQL?

    我有一个 MySQL 服务器 其中有一个用户和密码 我想在 shell 脚本中执行一些 SQL 查询而不指定密码 如下所示 config sh MYSQL ROOT root MYSQL PASS password mysql sh sou

随机推荐

  • 深圳益百分稳健前行 在商业创新中寻找平衡点

    文 李永华 来源 螳螂财经 ID TanglangFin 遭遇舆论危机后 滴滴创始人之一柳青曾在微博上晒出程维的照片 并配文 一个在两周内瘦成一道闪电的男人 程维快速变瘦的背后是一个高速发展的巨头级企业面临巨大监管和舆论压力的写照 一边是庞
  • Entity Framework Core系列教程-4 DbContext

    Entity Framework Core DbContext DbContext类是Entity Framework Core的组成部分 DbContext实例代表与数据库的会话 可用于查询实体实例并将其保存到数据库 DbContext是
  • SQL注入代码实践(盲注-获取数据库名长度【数值型】)

    coding utf 8 Time 2022 4 4 16 19 Auth zhangxiang File GetLength Inject py IDE PyCharm Motto ABC Always Be Coding 获取数据库名长
  • STM32——USART串口

    文章目录 一 通信接口 二 串口通信 三 硬件电路 四 电平标准 五 串口参数及时序 六 STM32的USART外设简介 七 USART框图 八 USART基本结构 九 数据帧 十 起始位侦测和采样位置对齐 十一 数据采样 十二 波特率发生
  • 副高相当于副处吗_事业单位岗位工资副高职为何分为五六七级,调级时..._事业单位考试_帮考网...

    一般机关 事业单位工资制度和晋升等 各地都会按照国家人事部 财政部 国家计委 关于印发机关 事业单位工作人员正常晋升工资档次办法的通知 来制定当地的工作晋升等标准和规定 建议咨询当地的组织部门 1 五级职员 是指事业单位正处级别 根据试行办
  • PLY格式学习

    最近写论文为了使三维重建结果呈现的更加漂亮直观一些 尝试对三维空间数据进行表面重建 采用Poisson Reconstruction 点击打开链接 方法 该方法使用的数据格式为ply格式 Ply格式是Stanford Stanford Bu
  • 关于“Unable to establish loopback connection Connection timed out: connect”问题的解决方案参考

    前言 最近使用AS 3 0启动一个工程 在gradle同步的时候 出现了 Unable to establish loopback connection Connection timed out connect 的问题 在网上找了很久 主要
  • shell基础

    目录 shell脚本介绍 一 shell脚本是什么 二 为什么要学shell 而不是其他计算机语言 三 学习这门课程的优势 四 学了能干什么 五 学习什么内容 六 学习的技巧 七 成长路径 八 学习环境 编程语言与shell脚本 一 编程语
  • React 查找表格数据例子

    假设我们已经有了一个返回 JSON 的 API category Sporting Goods price 49 99 stocked true name Football category Sporting Goods price 9 9
  • 简单修改,让CI支持memcache

    CI默认只支持memcaced 今天在网上搜索了下 一些解决方案都是错的 经过ci源代码分析 给出一个正确的解决方案 1 复制driver目录下的memcachd php为memcache php 并且将memcached替换为memcac
  • Altium designer第二屏幕导致的问题

    由于之前笔记本电脑通过VGA线连接第二屏幕使用 但是在一些情况下第二屏幕不在 但是打开Altium designer相关窗口后还默认在第二屏幕 导致软件无法操作 解决方法 1 当Altium Designer 的某一窗口跑到另外一个显示屏上
  • 停用词(stop words)+TF-IDF实现

    一 什么是停用词 在汉语中 有一类没有实际意义的词语 比如组词 的 连词 以及 副词 甚至 语气词 吧 被称为停用词 一个句子去掉这些停用词 并不影响理解 所以 进行自然语言处理时 一般将停用词过滤掉 一般词表文件中每一行存储一个停用词 行
  • Linux版的CASTEP功能更强大,castep在linux下的安装步骤.docx

    castep在linux下的安装步骤 卸载 一 MS卸载 1 首先进入home msi Accelrys Materials Studio40 etc Gateway然后执行 msgateway control 18888 stop 即停掉
  • 服务器无法登录之迷——login界面无限循环

    本周遇到了一个很奇葩的问题 客户的一台服务器无论如何都无法登录到机器系统里面去 可以肯定的是输入的登录密码是完全正确的 但是输入密码后 总在login登录界面无限循环 今天抽空总结下这个问题的前因后果 登录异常现象 1 ssh登录成功后 会
  • vue项目页面进行数据更新的三种方法

    1 场景 在处理列表时 常常有删除一条数据或者新增数据之后需要重新刷新当前页面的需求 2 遇到的问题 用vue router重新路由到当前页面 页面是不进行刷新的 3 采用window reload 或者router go 0 刷新时 整个
  • mysql 误删binlog_mysql binlog日志 误删数据 用于恢复数据

    1 binlog 日志打开方法 在my cnf这个文件中加一行 Windows为my ini vi etc my cnf mysqld log bin mysqlbin log 添加这一行就ok了 号后面的名字自己定义吧 然后我们可以对数据
  • Linux线程

    目录 线程概念 原生线程库pthread 线程的优点 线程的缺点 线程异常 线程用途 Linux进程VS线程 Linux线程控制 创建线程 获取线程ID 线程ID及进程地址空间布局 线程等待 线程终止 线程取消 分离线程 线程概念 什么是线
  • VM虚拟机下添加一个硬盘

    VM虚拟机下添加一个硬盘 一 新建虚拟硬盘 打开VMware 选择菜单 VM gt settings gt Add gt 下一步 gt 选择 Harddisk 点 下一步 gt 选 creat a new virtual disk 点 下一
  • 三大抽样分布:卡方分布,t分布和F分布的简单理解

    有很多统计推断是基于正态分布的假设 以标准正态分布变量为基石而构造的三个著名统计量在实际中有广泛的应用 这是因为这三个统计量不仅有明确背景 而且其抽样分布的密度函数有显式表达式 它们被称为统计中的 三大抽样分布 这三大抽样分布即为著名的卡方
  • C、C++写二进制数据到mysql的Blob字段/插入images

    引子 由于调试需要 需直接往数据库里写入二进制数据 本来这些数据是由上层软件来写的 用的是C 为了熟悉C语言的数据库操作 还是决定用C来写这段调试代码 概况 表名 Task 涉及的字段及属性 NumDest int 11 用于存储目标数目