目录
拥有本地账户
安装库
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
进去之后寻找 MySOL Community(GPL) Downloads
进入
进来之后就是这样,右边一列就有我们想要使用何种语言连接 mysql 下面我们使用C语言,所以点击右侧第一个 C API (libmysqlclient)
点击
选择自己想要下载的版本,以及安装环境,上面这里默认安装的是最新的,如果有想要之前版本的也可以下载以前的版本,点击 Archives
这里就可以选择想要下载的版本
查看 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
上面既然已经有了 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
这样就没问题了,把库文件引进来了
首先在官方文档
点击 DOCUMENTATION
进来后找到 CAPI 这是因为我们使用C语言链接
进入之后点击函数
然后就可以看到常用函数了
下面我们挑一些常用的介绍
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)