花瓣小跑 发表于 2024-7-26 06:13:52

【MySQL】MySQL库

一、mysql connect

要利用C语言毗连 mysql,需要利用 mysql 官网提供的库,大家可以去官网下载。
由于我们从前在我们的 Linux 中已经安装了有关 MySQL 的安装包,它会默认帮我们安装了链接 MySQL 的头文件和库,我们可以检察一下:
https://i-blog.csdnimg.cn/blog_migrate/07ebd5a4f49e5b69c88796a24a886a95.png
https://i-blog.csdnimg.cn/blog_migrate/3e5cf781f61dae4149b9764ffc611e84.png
此中 include 包罗所有的方法声明, lib64 包罗所有的方法实现(打包成库)。
假如大家在安装的时候没有这些头文件和库,可以实行如下指令安装:
                                sudo yum install mysql-devel
安装好以后,我们可以通过 mysql_get_client_info() 接口函数,来验证我们是否引入乐成:
                                #include <iostream>
                                #include <mysql/mysql.h>
                               
                                int main()
                                {
                                  std::cout <<mysql_get_client_info() << std::endl;
                                  return 0;
                                }
效果如下:
https://i-blog.csdnimg.cn/blog_migrate/ccc4d8fc433231516be501ad2ef457f7.png
如上,我们就乐成引入了。
二、mysql 接口先容

我们可以检察 MySQL5.7 的接口文档先容。
1. 初始化 mysql_init()

想要利用库,必须先进行初始化,其函数为 mysql_init(),其在官方文档中的定义如下:
                                MYSQL *mysql_init(MYSQL *mysql);
它的返回值是一个 MySQL* 的对象,我们可以这样初始化:
                                MYSQL* fp = mysql_init(nullptr);
2. 链接数据库 mysql_real_connect()

初始化完毕之后,必须先链接数据库,在进行后续操作。(mysql 网络部门是基于 TCP/IP 的),其在官方文档的定义如下:
                        MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
                                        const char *user,
                                        const char *passwd,
                                        const char *db,
                                        unsigned int port,
                                        const char *unix_socket,
                                        unsigned long clientflag);
此中 mysql 为我们初始化返回的对象;host 为需要链接的主机;user 为用户名;passwd 为用户密码;db 为利用的数据库名称;port 为端标语;背面两个参数不紧张,我们可以设置为 nullptr 和 0。
而返回值假如乐成是一个对象,否则就是空,接下来我们就可以利用这个接口了,比方以下代码,我们将函数中的参数在全局中用对应的名字定义了,所以直接传进去即可:
                                int main()
                                {
                                  MYSQL* my = mysql_init(nullptr);
                                  if(my == nullptr) return -1;
                               
                                  if(mysql_real_connect(my, host, user, passwd, db, port, nullptr, 0) == nullptr) return -1;
                               
                                  return 0;
                                }
假如 nullptr 报错,修改一下 g++ 选项即可:
                                g++ -o test test.cpp -std=c++11 -l mysqlclient -L /lib64/mysql
建立好链接之后,获取英文没有题目,假如获取中文是乱码,是由于原始默认是 latin1,我们可以通过接口设置链接的默认字符集是 utf8,如下:
                                mysql_set_character_set(my, "utf8");
3. 实行 mysql 命令 mysql_query()

我们检察文档中的先容:
https://i-blog.csdnimg.cn/blog_migrate/ce013b4e79f3da187b6af55f3c65a168.png
https://i-blog.csdnimg.cn/blog_migrate/4369278a59a4072ee79fc04ced91191e.png
                                int mysql_query(MYSQL *mysql, const char *stmt_str);
此中返回值0为乐成,非0则是失败;第一个参数上面已经先容过,第二个参数为要实行的 sql 语句。我们先在库中创建一张表,如下:
https://i-blog.csdnimg.cn/blog_migrate/19e8ae1e143684160be46d4ede283426.png
接下来我们利用接口插入数据:
                                int main()
                                {
                                  MYSQL* my = mysql_init(nullptr);
                                  if(my == nullptr) return -1;
                               
                                  if(mysql_real_connect(my, host, user, passwd, db, port, nullptr, 0) == nullptr) return -1;
                               
                                  mysql_set_character_set(my, "utf8");
                               
                                  if(mysql_query(my, "insert into for_test values(1,'James')") != 0) return -1;
                                  else std::cout << "query success" << std::endl;
                               
                                  return 0;
                                }
运行效果如下:
https://i-blog.csdnimg.cn/blog_migrate/ef06ade7305d895742df01925aa801a4.png
接下来检察数据库中的表数据:
https://i-blog.csdnimg.cn/blog_migrate/08a169f466cf2fbe278082983e8d7c02.png
假如我们利用 mysql_query() 检察表数据呢?我们可以尝试一下:
                                int main()
                                {
                                  MYSQL* my = mysql_init(nullptr);
                                  if(my == nullptr) return -1;
                               
                                  if(mysql_real_connect(my, host, user, passwd, db, port, nullptr, 0) == nullptr) return -1;
                               
                                  mysql_set_character_set(my, "utf8");
                               
                                  if(mysql_query(my, "select * from for_test") != 0) return -1;
                                  else std::cout << "query success" << std::endl;
                               
                                  return 0;
                                }
https://i-blog.csdnimg.cn/blog_migrate/5cb8944457ac234a90e84e5111acbf18.png
我们看到,运行之后虽然乐成了,但是什么都没有显示出来,这是因为 sql 假如是查询语句,我们还要读取数据!
4. 获取实行效果 mysql_store_result()

实在 my 中会存放每次读取到的效果,但是这个效果还需要我们再次提取出来,所以假如 mysql_query 返回乐成,那么我们就通过 mysql_store_result 这个函数来读取效果。原型如下:
https://i-blog.csdnimg.cn/blog_migrate/d7f98e6e65667e828cc8b654199f8aa1.png
                                MYSQL_RES *mysql_store_result(MYSQL *mysql);
该函数会调用 MYSQL 变量中的 st_mysql_methods 中的 read_rows 函数指针来获取查询的效果。同时该函数会返回 MYSQL_RES 这样一个变量,该变量主要用于生存查询的效果。同时该函数 malloc 了一片内存空间来存储查询过来的数据,所以我们肯定要记得 free(result),不然是肯定会造成内存泄漏的。 实行完 mysql_store_result 以后,实在数据都已经在 MYSQL_RES 变量中了。下面的 api 基本就是读取 MYSQL_RES* 中的数据:


[*] 获取效果行数 mysql_num_rows
                        my_ulonglong mysql_num_rows(MYSQL_RES *res);

此中 my_ulonglong 就是 unsigned long long,如下图:
https://i-blog.csdnimg.cn/blog_migrate/261ceda5a5d5188d0fd0563789c31134.png


[*] 获取效果列数 mysql_num_fields
                        unsigned int mysql_num_fields(MYSQL_RES *res);

[*] 获取列属性 mysql_fetch_fields
                        MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

mysql_fetch_fields 可以获取列的属性,此中获取列属性中的列名只需要指定 name 即可,如下:
                           // 属性
                          MYSQL_FIELD *field_array = mysql_fetch_fields(res);
                          for(int i = 0; i < fields; i++)
                          {
                                std::cout << field_array.name << "\t";
                          }
                          std::cout << std::endl;


[*] 获取效果内容 mysql_fetch_row
                        MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

我们该怎么明白读取这个数据呢?起首需要知道,mysql 将所有的数据读取出来的时候全部都看成字符串。
其次我们在 select * from for_test 的时候,显示出来的是一个表格的形状,所以我们就可以给它进行按行按列分割,如下图:
https://i-blog.csdnimg.cn/blog_migrate/699073d39ddef969233900cec8411ddf.png
实在我们可以把这个返回的 MYSQL_ROW变量看作是一个 char** 的指针,如下图:
https://i-blog.csdnimg.cn/blog_migrate/02b6e2c5fb214ecabac15f4a4f0165bb.png
更紧张的是,返回的这个 MYSQL_ROW的变量可以像迭代器一样利用,我们不需要手动进行迭代,它会帮我们自己迭代,比方:
                          // 内容
                          for(int i = 0; i < rows; i++)
                          {
                                MYSQL_ROW line = mysql_fetch_row(res);
                                for(int j = 0; j < fields; j++)
                                {
                                    std::cout << line << "\t";
                                }
                                std::cout << std::endl;
                          }
5. 释放空间

我们上面开发的空间我们最后也要释放掉,就是 char** 这段空间,接口为:
https://i-blog.csdnimg.cn/blog_migrate/4ce7d4aeb41ab40ebcfcd68d41b31aba.png
我们在最后直接调用即可,参数就是我们上面的 res.
5. 关闭 mysql 链接 mysql_close()

                                void mysql_close(MYSQL *mysql);
关闭链接我们直接调用以上方法即可,参数就是我们初始化的返回值。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【MySQL】MySQL库