赞
踩
目录
要使用C/C++连接mysql,需要devel(开发库),一般来说在Linux上下好了MySQL这个库也会顺带给我们下载好。如果没有也可以单独安装。
- 使用命令 rpm -qa | grep mysql 查看是否有mysql相关的库,重点是devel(开发库):
- 使用命令 ls /lib64/mysql/ -al 查看库的链接情况
- 使用命令 ls /usr/include/mysql/ 查看mysql相关的头文件:
如果只是缺少devel(开发库)可尝试用yum安装
yum install -y mysql-community-devel
安装好devel(开发库)后:
我们只需要用 #include <mysql/mysql.h> 就可引入mysql库。
编译时加上:-L/lib64/mysql -lmysqlclient 帮助编译器找到头文件和库即可。
3.0 须知
如果无法安装devel(开发库),还可以到官网下载开发包,再上传到Linux,但是不推荐怎么做,因为可能会因为开发包和自己MySQL的版本不同而出现各种奇奇怪怪的问题:如ssl证书问题,套接字问题……
所以能不这样做尽量不要这样做,要用这个方法还不如看博主文章重新安装MySQL。
按照里面的方法一定能安装好mysql和devel(开发库)。
3.1 到官网下载开发包
a. 官网下载Download Archives
![]()
b. 选择MySQL Connector/C
c. 选择系统和版本。下图为Linux版的下载。
![]()
3.2 上传安装包至Linux
a. 上传安装包: rz -y
b. 解压: tar -xzvf mysql-connector-c-6.1.11-linux-glibc2.12-x86_64.tar.gz
c. 在要使用库的目录下建立头文件的软链接和库的软链接
d. 修改配置文件让g++编译时能找到动态库
如果提示找不到动态库libmysqlclient,我们还需要修改配置文件(以下命令建议在root用户下执行):
1. 添加配置文件:vim /etc/ld.so.conf.d/lib_search.conf
2. 往里面加入 mysql库中lib目录的路径:
路径获取方式:cd进入刚才解压好的文件中,使用pwd lib查看lib目录的路径
3. 然后运行指令 sudo ldconfig 更新配置文件
e. 写代码时要引入头文件 "软链接地址/mysql.h"
编译时要加上 -I./头文件的软链接地址/include -L./库的软链接地址 -lmysqlclient 帮助编译器找到头文件和库。
- 函数:
- mysql_init()
- 示例:
- MYSQL *mysql = mysql_init(NULL);
- 函数:
- mysql_close(要销毁的对象);
- 示例:
- mysql_close(mysql);
初始化完毕之后,必须先链接数据库,在进行后续操作。(mysql网络部分是基于TCP/IP的)
- 函数:
- mysql_real_connect(mysql, host, user, passwd, db, port, unix_socket, clientflag)
- //使用指定用户登录指定数据库,该用户必须有远程访问权限
-
- 参数说明:
- mysql : mysql对象
- host : 要连接的主机
- user : mysql用户,该用户必须有远程访问权限
- passwd : 用户密码
- db : 要连接的数据库
- port : 端口号
- unix_socket : 套接字,nullptr为默认由系统选择
- clientflag : 客户端标志,默认为0
-
- 示例:
- {
- std::string host = "localhost";
- std::string user = "test"; //该用户必须有远程访问权限
- std::string passwd = "123";
- std::string db = "test_table";
- unsigned int port = 3306;
- if(mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
- {
- fprintf(stderr, "%s\n", mysql_error(mysql)); //显示连接时遇到的错误
- std::cerr << "Failed to connect to MySQL user!\n";
- exit(-2);
- }
- std::cout << "Successfully to connect to MySQL user!\n";
- }

- //建立好链接之后,获取英文没有问题,但如果获取中文就是乱码。
- //设置链接的默认字符集为utf8,原始默认是latin1(拉丁文)
- mysql_set_character_set(myfd, "utf8");
- 函数:
- int mysql_query(MYSQL *mysql, const char *sql);
- //下发SQL语句,让上面指定用户执行SQL语句对上面指定的数据库进行操作
- 参数:
- mysql : mysql对象
- sql : sql语句
- 返回值:
- 成功返回0,失败返回1。
- 示例:
- std::string sql = "select * from test_table";
- int n = mysql_query(mysql, sql.c_str());
- 函数:
- MYSQL_RES *mysql_store_result(MYSQL *mysql);
-
- 参数:
- mysql对象。
-
- 返回值:
- MYSQL_RES对象,一个专门用来保存查询结果的对象,它有各种获取结果的方法。
-
- 说明:
- 对于该函数,我们需要自己创建一个MYSQL_RES指针来接收返回的MYSQL_RES对象,因为
- MYSQL_RES对象malloc了一片内存空间来存储查询过来的数据,所以我们一定要记得 free(),
- 不然会造成内存泄漏。如果用的是较新版本的devel(开发库),可能创建出来的MYSQL_RES对象
- 会自动释放,free会报空指针异常,就不用free。执行完mysql_store_result()以后,其实
- 数据都已经在MYSQL_RES对象中了,下面的api基本就是读取 MYSQL_RES对象中的数据。
-
- 示例:
- MYSQL_RES* res = mysql_store_result(mysql);
- if(res == nullptr) exit(0);
- free(res); //如果报错证明当前版本的开发库中的mysql对象会自动释放,删除此句即可。

- 函数:
- my_ulonglong mysql_num_rows(MYSQL_RES *res);
-
- 参数:
- MYSQL_RES对象。
-
- 返回值:
- 一个长整型。
-
- 示例:
- int rows = mysql_num_rows(res);
- std::cout << "表中有" << rows << "行。\n";
- 函数:
- unsigned int mysql_num_fields(MYSQL_RES *res);
- 参数:
- MYSQL_RES对象。
- 返回值:
- 一个无符号整型。
- 示例:
- int cols = mysql_num_fields(res);
- std::cout << "表中有" << cols << "列。\n";
- 函数:
- MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
-
- 参数:
- MYSQL_RES对象。
-
- 返回值:
- MYSQL_FIELD:结构体数组指针,指向结构体数组,结构体的name成员为字符串通过用来保存列名。
-
- 示例:
- int cols = mysql_num_fields(res); //获取列数
- MYSQL_FIELD *col_name = mysql_fetch_fields(res);
- for(int i = 0; i < cols; i++)
- {
- std::cout << col_name[i].name << " | ";
- }

- 函数:
- MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
-
- 参数:
- MYSQL_RES对象。
-
- 返回值:
- MYSQL_ROW对象,相当于一个二维数组,用来保存表中内容
-
- 示例:
- MYSQL_ROW line; //创建MYSQL_ROW对象,用来保存表中内容
- for(int i = 0; i < rows; i++) //行数rows通过mysql_num_rows()获取。
- {
- line = mysql_fetch_row(res);
-
- for(int j = 0; j < cols; j++) //列数cols通过mysql_num_fields()获取。
- {
- std::cout << line[j]<< " "; //打印第i行的第j列内容。
- }
- std::cout << std::endl;
- }

- my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
- my_bool STDCALL mysql_commit(MYSQL * mysql);
- my_bool STDCALL mysql_rollback(MYSQL * mysql);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。