13.使用C连接mysql
sudo useradd 用户名 - - - 创建用户
sudo passwd 用户名 - - - 创建密码
使用C连接mysql,一般在装mysql服务的时候都会自动安装好连接的包。
查看:
ls /usr/include/mysql - - - 查看头文件是否存在
ls /lib64/mysql - - - 查看动静态库是否存在
如果不存在,使用 yum install mysql-devel 安装一下
选项:-L 指定去哪里找这个库 -l 找哪个库
测试:库是否能够使用,调用成功返回库的版本。
在linux中如果不能直接删除,需要按住crl再进行删除
常用的库函数:
打开数据库操作模块:
MYSQL* my = mysql_init(nullptr); - - - 生成mysql库这个结构体进行操作。
关闭数据库操作模块:
mysql_close(my); - - - 每次使用musql时必须先打开,然后进行操作,最后关闭。
连接数据库:
MYSQL *mysql_real_connect(
MYSQL *mysql, // 创建的mysql结构体
const char *host, // 登陆的地点
const char *user, // 登录的用户
const char *passwd, // 登陆的密码
const char *db, // 连接哪个数据库
unsigned int port, // mysql的端口号
const char *unix_socket, // 设置为null
unsigned long clientflag // 设置为null
);
操作:
int mysql_query(my, sql语句) - - - 这里的sql语句为char字符串风格,不用带分号,返回0表示成功。
设置编码语言为utf8,不然利用编码插入汉字时,就会出现插入乱码
mysql_set_character_set(myfd, “utf8”);
sql语句只要写好,就可以利用该方法增删改。以下以insert为例:
查找:select
查找的话,单单一个语句是不能够进行查询的。因为语句只能保证操作成功,要是你想看到得把信息提取出来。
查询语句如果成功,他会将信息放到创建的my结构体中,需要利用函数将信息从my中提取出来
利用:MYSQL_RES* mysql_store_result(my); - - - 提取信息,提取出来的res 的每一行都是数据中的一行。但是这种还不好查看,因此需要再利用函数将他的每一行提取出来。
信息被提取到res后,使用完成后也需要释放res的空间:
mysql_free_result(res); - - - 释放res的空间
利用:
my_ulonglong mysql_num_rows(MYSQL_RES *res); - - - 提取行数
unsigned int mysql_num_fields(MYSQL_RES *res); - - - 提取列数
然后知道行数和列数后,利用函数将每一行整体拿出来。只需要让行数从0开始自增,他自己会拿出对应行的数据,不用你去选择拿哪一行。
MYSQL_ROW row = mysql_fetch_row(res); - - - 拿出这一行的数据
row代表这一行,然后只需要按照列将值打印就行 row[列]
拿到信息后,还想知道它对应的每一个信息的属性,包含表的属性,表的列名,表在那个库等等,所有的属性都打包成一个结构体。
利用函数获取属性结构体:
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
因为打印表的信息只关心列名和每一列的数据,因此在属性结构体中选择列名打印:
完整代码:
#include <iostream>
#include <string>
#include <mysql/mysql.h>
#include <unistd.h>using namespace std;
const string host = "127.0.0.1";
const string user = "ghc";
const string passwd = "123456";
const string db = "conn";
const unsigned int port = 3306;
int main()
{MYSQL* my = mysql_init(nullptr);if(my == nullptr){std::cerr << "int Mysql error" << std::endl;return 1;}if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0)==nullptr){std::cerr << "connect Mysql error" << std::endl;return 2;}mysql_set_character_set(my, "utf8");// 查询: 查询语句如果成功,他会将信息放到创建的my结构体中,需要利用函数将信息从my中提取出来string sql = "select * from user";int n = mysql_query(my, sql.c_str());cout << n << endl;MYSQL_RES* res = mysql_store_result(my); //提取信息if(res == nullptr) {cerr << "mysql_store_result 提取失败" << endl;return 4;}// 提取到数据,利用res和函数获取行和列int rows = mysql_num_rows(res); // 获取行树int fields = mysql_num_fields(res); // 获取列数cout << "行:" << rows << endl;cout << "列:" << fields << endl;// 获取属性信息,他是一个结构体包含name在内的所有属性,MYSQL_FIELD* fields_array = mysql_fetch_fields(res);for(int i=0; i<fields; i++){// filelds_array是一个表的所有属性的结构体,因此需要在结构中选择namecout << fields_array[i].name << "\t";}cout << endl;for(int i=0; i<rows; i++){// 利用函数,将每一行的数据整体拿出来放到一个空间中MYSQL_ROW row = mysql_fetch_row(res);for(int j=0; j<fields; j++){cout << row[j] << "\t";}cout << endl;}// 插入的方法,删除和修改也这样写都ok// string sql3 = "insert into user (name, age, tephone) values('武松', 20, 66666)";// int n3 = mysql_query(my, sql3.c_str());// cout << n3 << endl;// string sql1 = "insert into user (name, age, tephone) values('tom', 18, 12345)";// string sql2 = "insert into user (name, age, tephone) values('jerry', 8, 54345)";// int n1 = mysql_query(my, sql1.c_str());// int n2 = mysql_query(my, sql2.c_str());// if(n1 == 0) cout << sql1 << " success " << endl;// else cout << "sql1 filed" << endl;// if(n2 == 0) cout << sql2 << " success " << endl;// else cout << "sql2 filed" << endl;mysql_free_result(res);mysql_close(my);return 0;
}