C 与 C++ 如何引入 mysql 客户端

目录

拥有本地账户

安装库

mysql 头文件引入

mysql 的常用函数


想要用语言引入 mysql 的数据库,需要做两件准备工作。

拥有本地账户

首先创建用户 connecter

mysql> create user 'connecter'@'localhost' identified by '**********';
Query OK, 0 rows affected (0.00 sec)

赋权

mysql> create database conn;
Query OK, 1 row affected (0.01 sec)
​
mysql> grant all on conn.* to 'connecter'@'localhost';
Query OK, 0 rows affected (0.00 sec)
​
mysql> show grants for 'connecter'@'localhost';
+-------------------------------------------------------------+
| Grants for connecter@localhost                              |
+-------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'connecter'@'localhost'               |
| GRANT ALL PRIVILEGES ON `conn`.* TO 'connecter'@'localhost' |
+-------------------------------------------------------------+
2 rows in set (0.00 sec)
​
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

安装库

我们进到 官网

进入官网后,下面点击 downloads

C 与 C++ 如何引入 mysql 客户端_第1张图片

进去之后寻找 MySOL Community(GPL) Downloads

C 与 C++ 如何引入 mysql 客户端_第2张图片

进入

C 与 C++ 如何引入 mysql 客户端_第3张图片

进来之后就是这样,右边一列就有我们想要使用何种语言连接 mysql 下面我们使用C语言,所以点击右侧第一个 C API (libmysqlclient)

C 与 C++ 如何引入 mysql 客户端_第4张图片

点击

C 与 C++ 如何引入 mysql 客户端_第5张图片

选择自己想要下载的版本,以及安装环境,上面这里默认安装的是最新的,如果有想要之前版本的也可以下载以前的版本,点击 Archives

C 与 C++ 如何引入 mysql 客户端_第6张图片

这里就可以选择想要下载的版本

查看 mysql 版本

[root@slave0 log]# mysql --version;
mysql  Ver 14.14 Distrib 5.7.43, for Linux (x86_64) using  EditLine wrapper

下载成功后,将该压缩包传到 linux 上,然后解压,里面就是库,然后就可以在编译的时候使用

yum 安装 mysql 服务

前面在去哪黄 mysql 的时候跟新了 myslq 的源,所以现在也可以直接 yum

yum install -y mysql-community-server

一般下载好 mysql 的头文件在

/usr/include/mysql
[root@slave0 mysql]# ls /usr/include/mysql
big_endian.h              my_compiler.h       mysql_embed.h      plugin_group_replication.h
binary_log_types.h        my_config.h         mysql.h            plugin.h
byte_order_generic.h      my_config_x86_64.h  mysql_time.h       plugin_keyring.h
byte_order_generic_x86.h  my_dbug.h           mysql_version.h    plugin_validate_password.h
decimal.h                 my_dir.h            mysqlx_ername.h    sql_common.h
errmsg.h                  my_getopt.h         mysqlx_error.h     sql_state.h
keycache.h                my_global.h         mysqlx_version.h   sslopt-case.h
little_endian.h           my_list.h           my_sys.h           sslopt-longopts.h
m_ctype.h                 mysql               my_thread.h        sslopt-vars.h
m_string.h                mysql_com.h         my_thread_local.h  thr_cond.h
my_alloc.h                mysql_com_server.h  my_xml.h           thr_mutex.h
my_byteorder.h            mysqld_ername.h     plugin_audit.h     thr_rwlock.h
my_command.h              mysqld_error.h      plugin_ftparser.h  typelib.h

上面就是 mysql 的头文件

mysql的动静态库在

/usr/lib64/mysql

一般在CentOS按照那个好像一般都会安装到该路径下

[root@slave0 mysql]# ls /usr/lib64/mysql
libmysqlclient.a            libmysqlclient.so         libmysqlclient.so.20       mecab
libmysqlclient_r.so.18      libmysqlclient.so.18      libmysqlclient.so.20.3.30  plugin
libmysqlclient_r.so.18.1.0  libmysqlclient.so.18.1.0  libmysqlservices.a

mysql 头文件引入

上面既然已经有了 myslq 的头文件以及库文件,那么下面学习一下接口

其中在 mysql 的头文件里面有一个 mysql_get_client_info() 的函数,该函数只是返回mysql1的版本下面我们编辑一段代码

#include
using namespace std;
#include
​
​
int main()
{
    cout << "mysql version: " << mysql_get_client_info() <

下面我们编译一下

[root@slave0 test_remote_mysql]# g++ test.cc 
/opt/rh/devtoolset-9/root/usr/libexec/gcc/x86_64-redhat-linux/9/ld: /tmp/cc3zOVxA.o: in function `main':
test.cc:(.text+0x1c): undefined reference to `mysql_get_client_info'
collect2: error: ld returned 1 exit status

这里这样编译显示不认识该函数,为什么?

这里是因为该函数在mysql.h里面而编译器找不到所以无法链接,下面编译的时候添加链接库

[root@slave0 test_remote_mysql]# g++ test.cc -lmysqlclient
/opt/rh/devtoolset-9/root/usr/libexec/gcc/x86_64-redhat-linux/9/ld: 找不到 -lmysqlclient
collect2: error: ld returned 1 exit status

这里也显示找不到,但是找不到该库,下面还需要声明一下该库的位置

[root@slave0 test_remote_mysql]# g++ test.cc -L/lib64/mysql -lmysqlclient

编译好后 ldd 查看一下

[root@slave0 test_remote_mysql]# ldd a.out 
    linux-vdso.so.1 =>  (0x00007fff2bb79000)
    libmysqlclient.so.20 => /usr/lib64/mysql/libmysqlclient.so.20 (0x00007fdd4afa5000)
    libstdc++.so.6 => /root/.VimForCpp/vim/bundle/YCM.so/el7.x86_64/libstdc++.so.6 (0x00007fdd4ac24000)
    libm.so.6 => /lib64/libm.so.6 (0x00007fdd4a922000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fdd4a70c000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fdd4a33e000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fdd4a122000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fdd49f1e000)
    librt.so.1 => /lib64/librt.so.1 (0x00007fdd49d16000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fdd4b948000)

这样就没问题了,下面运行一下

[root@slave0 test_remote_mysql]# ./a.out 
mysql version: 5.7.43

这样就没问题了,把库文件引进来了

mysql 的常用函数

首先在官方文档

点击 DOCUMENTATION

C 与 C++ 如何引入 mysql 客户端_第7张图片

进来后找到 CAPI 这是因为我们使用C语言链接

C 与 C++ 如何引入 mysql 客户端_第8张图片

进入之后点击函数

C 与 C++ 如何引入 mysql 客户端_第9张图片

然后就可以看到常用函数了

C 与 C++ 如何引入 mysql 客户端_第10张图片

下面我们挑一些常用的介绍

  • MYSQL *mysql_init(MYSQL *mysql)

  • 要使用库,必须先进行初始化!

  • 例:MYSQL * mfp = mysql_init(NULL)

  • 链接数据库 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 client_flag)
  • mysql:句柄

  • host:主机

  • user:用户名

  • passwd:密码

  • db:数据库

  • port:端口号

  • unix_socket:域间套接字 设置为 null 即可

  • client_flag:设置为 0 即可

向mysql 下发指令

  • mysql_query

int
mysql_query(MYSQL *mysql,
            const char *stmt_str)

设置编码

  • mysql_set_character_set

int
mysql_set_character_set(MYSQL *mysql,
                        const char *csname)

提取查询结果

  • mysql_store_result

MYSQL_RES *
mysql_store_result(MYSQL *mysql)

获取行数

  • mysql_num_rows

my_ulonglong
mysql_num_rows(MYSQL_RES *result)

获取列数

  • mysql_num_fields

unsigned int
mysql_num_fields(MYSQL_RES *result)

获取列名

  • mysql_fetch_fields

MYSQL_FIELD *
mysql_fetch_fields(MYSQL_RES *result)

获得一行记录

  • mysql_fetch_row

MYSQL_ROW
mysql_fetch_row(MYSQL_RES *result)

既然我们的数据可以转储到一个 MYSQL_RES 的指针中,那么说明 mysql 一定会帮我们 malloc 一段空间,那么我们当然是需要释放这段空间的,而我们也不需要调用 free 或者 delete 这样的函数或者操作符mysql 为我们提供了函数

  • mysql_free_result

void
mysql_free_result(MYSQL_RES *result)

你可能感兴趣的:(mysql,mysql,c语言,c++)