曾尝试用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,改为适合大小即可。具体代码摘自这位博主: