MYSQL 学习笔记

曾尝试用Qt自带的接口对数据库进行访问,发现效率不如原本自带的接口高,所以就采用了MySQL提供的C语言接口。

写SQL语句难度并不大,应该是我的数据库存储需求也复杂吧。对比较重要的几点做一下记录,以便后续需要的时候进行深入。

(1)数据库的类型

数据库引擎有默认是InnoDB,这种格式如果要将其导入到其他主机的或者移植是通道SQL语句导入导出的方式,而MyISAM则可以直接将文件拷贝到新主机或者新的“database root”后,就可以加载访问,移植比较简单。

https://www.jianshu.com/p/4bb9f78b4f6d

(2)数据库连接和表的创建。

在我使用MYSQL的C接口连接数据库的时候,可以先连接服务器后选择数据库,也就是数据库名称传入NULL。

也可以先连接上默认有的数据库“test”,再进行数据库的创建,后再选择创建的数据库。

创建数据库后,仍然遇到一些问题,新建的存储图像的表出现访问问题,查询该数据库的大小并不能得到结果,返回值为NULL,

std::string sql;
sql = "CREATE Database if not exists 数据库名 DEFAULT CHARACTER SET utf8;";
int r;
r = mysql_send_query(con, sql.data(), sql.length());
sql = "GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER ON 数据库名.*TO 数据库名@localhost IDENTIFIED BY '123456';";
r = mysql_send_query(con, sql.data(), sql.length());

查询数据库大小代码:

MYSQL_RES *result = NULL;
MYSQL_ROW sql_row;
string sql;
sql = "select concat(round(sum(data_length/1024/1024),2)) as data_length_MB from information_schema.tables "
"where  table_schema ='数据库名'  and table_name = '";
string sqlend = "';";
string basename = "errpic";
string num = std::to_string(i);
string errpicname = basename + num;

string finalsql = sql + errpicname + sqlend;
mysql_query(_con, finalsql.data());
result = mysql_store_result(_con);
if (result != NULL)
{
	sql_row = mysql_fetch_row(result);
	if (*sql_row != NULL)
	{
		/
	}
}

上面的代码测试过没有问题,但是在新建了数据库后,查询大小后result指针一直是NULL,最后只好通过重新连接数据库来解决,在第一次创建并选择对应数据库后进行大小访问并不成功。。。(原因还不明确)

数据库重新连接代码:

mysql_close(con);
con = mysql_init(NULL);
Connect = mysql_real_connect(con, host.data(), user.data(), pswd.data(), table_schema.data(), port, NULL, 0);
if (Connect == NULL)
{
    connectflag = 0;
    return;
}

(3)图像数据的存储

图像数据的存储比较方便的方式是采用SQL语句注入,数据采用MYSQL_TYPE_MEDIUM_BLOB类型,

不同类型的BLob数据的大小:

MySQL的四种BLOB类型 

类型                  大小(单位:字节) 
TinyBlob             最大 255 
Blob                  最大 65K 
MediumBlob     最大 16M 
LongBlob            最大 4G 

该方式插入数据需要更改my.ini文件

# The maximum size of one packet or any generated or intermediate string, or any parameter sent by the
# mysql_stmt_send_long_data() C API function.
max_allowed_packet=30M

原始的大小是4M,改为适合大小即可。具体代码摘自这位博主:

https://blog.csdn.net/xiangych/article/details/49045737

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值