errorbeep@home:~$

C++连接mysql


使用C++连接mysql,尝试在数据库表中插入数据。

启动mysql

在macOS上使用homebrew安装的mysql,使用brew services start mysql 启动mysql:

创建数据库并建表

c++连接mysql

连接数据库并向数据库表user中插入一条数据;

用到的函数:

MYSQL *mysql_init(MYSQL *mysql)
/*
   分配或初始化与mysql_real_connect()相适应的MYSQL对象。
   如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。
   如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。
   */
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)
/*
 “host”的值必须是主机名或IP地址。
如果“host”是NULL或字符串"localhost",连接将被视为与本地主机的连接。如果操作系统支持套接字(Unix)或命名管道(Windows),将使用它们而不是TCP/IP连接到服务器。
如果“port”不是0,其值将用作TCP/IP连接的端口号。注意,“host”参数决定了连接的类型。
如果unix_socket不是NULL,该字符串描述了应使用的套接字或命名管道。注意,“host”参数决定了连接的类型。
CLIENT_MULTI_STATEMENTS
通知服务器,客户端可能在单个字符串内发送多条语句(由‘;’隔开)。如果未设置该标志,将禁止多语句执行。
 */
int mysql_query(MYSQL *mysql, const char *query)
/*
mysql_query()不能用于包含二进制数据的查询,应使用mysql_real_query()取而代之(二进制数据可能包含字符‘\0’,mysql_query()会将该字符解释为查询字符串结束)。
如果查询成功,返回0。如果出现错误,返回非0值。
 */

最终代码:

#include<iostream>
#include<mysql.h>
#include<string>
using namespace std;

int main() {
    MYSQL *con = mysql_init(NULL);
    mysql_real_connect(con, "127.0.0.1", "root", "", "ChatProject", 0, NULL, CLIENT_MULTI_STATEMENTS);
    string sql = "insert into user values('bbbb', 'ddddd')";
    mysql_query(con, sql.c_str());
    return 0;
}

makefile

 找到mysql安装位置的头文件和库文件目录,编译和链接时要引用,指定链接库文件libmysqlclient

CC = /usr/bin/clang++
CFLAGS = -Wall -O0 -I/usr/local/Cellar/mysql/8.0.28/include/mysql -v
LIBS = -L/usr/local/Cellar/mysql/8.0.28/lib

msqltest: 
	${CC} ${CFLAGS} -o msqltest msqltest.cpp ${LIBS} -lmysqlclient

clean:
	rm msqltest

程序运行前表中数据

编译并运行程序