> 技术文档 > 13.使用C连接mysql

13.使用C连接mysql

sudo useradd 用户名 - - - 创建用户
sudo passwd 用户名 - - - 创建密码

使用C连接mysql,一般在装mysql服务的时候都会自动安装好连接的包。
查看:
ls /usr/include/mysql - - - 查看头文件是否存在
ls /lib64/mysql - - - 查看动静态库是否存在
如果不存在,使用 yum install mysql-devel 安装一下

选项:-L 指定去哪里找这个库 -l 找哪个库
测试:库是否能够使用,调用成功返回库的版本。
13.使用C连接mysql

在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
);
13.使用C连接mysql

操作:
int mysql_query(my, sql语句) - - - 这里的sql语句为char字符串风格,不用带分号,返回0表示成功。
设置编码语言为utf8,不然利用编码插入汉字时,就会出现插入乱码
mysql_set_character_set(myfd, “utf8”);
sql语句只要写好,就可以利用该方法增删改。以下以insert为例:
13.使用C连接mysql

查找: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);
因为打印表的信息只关心列名和每一列的数据,因此在属性结构体中选择列名打印:
13.使用C连接mysql

完整代码:

#include #include #include #include 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是一个表的所有属性的结构体,因此需要在结构中选择name cout << 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;}