要在语言级别连接mysql,需要使用mysql官网提供的库,大家可以去官网下载:mysql相关下载,我们这里以C语言连接MySQL,下载的库是:Connector/C,下载后拖拽上传到服务端,进行解压:
如果文件是xz为后缀的,执行以下命令解压:
tar -xJf xxx.tar.xz
如果文件是gz为后缀的,执行以下命令解压:
tar -xzf xxx.tar.gz
解压后的文件主要包含2个文件:include、lib,include 包含所有的方法声明, lib 包含所有的方法实现(打包成库),在进行链接时我们需要编译器找到这些库的路径,如果需要也可以将这些路径指定到系统中就不需要我们手动指定路径了。
下面就可以以C语言的方式访问MySQL了:
1.初始化:
MYSQL *mysql_init(MYSQL *mysql);
要使用库,必须先进行初始化!成功时返回一个指向已初始化的 MYSQL 结构体的指针。失败时返回 NULL。参数说明:
mysql
: 指向一个 MYSQL 结构体的指针。如果传入 NULL,函数会分配一个新的 MYSQL 结构体并返回其指针。如果传入一个已经分配好的 MYSQL 结构体指针,该结构体将被初始化,一般传入NULL即可。
2.链接数据库:
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 clientflag);
成功时返回一个指向已连接的 MYSQL 结构体的指针(与传入的 mysql 指针相同)。失败时返回 NULL,此时可以通过调用 mysql_error 函数来获取错误消息。参数说明:
-
mysql
: 指向已经通过 mysql_init 初始化的 MYSQL 结构体的指针。 -
host
: MySQL 服务器的主机名或 IP 地址。如果是本地连接,可以使用 “localhost” 或 “127.0.0.1”。如果设置为 NULL,则使用 mysql 结构体中设置的默认主机名。 -
user
: 用于连接数据库的用户名。 -
passwd
: 用户的密码。 -
db
: 要连接的数据库的名称。如果设置为 NULL,则在连接后需要单独使用 mysql_select_db 函数来选择数据库。 -
port
: MySQL 服务器的端口号。如果设置为 0,则使用默认的 MySQL 端口(通常是 3306)。 -
unix_socket
: UNIX 套接字文件的路径,用于本地连接。如果设置为 NULL,则使用默认的套接字文件或尝试 TCP/IP 连接。 -
clientflag
: 客户端标志,用于指定连接时使用的选项。可以是多个标志的组合,例如 CLIENT_INTERACTIVE、CLIENT_FOUND_ROWS 等。
建立好链接之后,默认字符集是latin1,一般英文数据是没有问题的,如果中文出现乱码,需要设置链接的默认字符集是utf8:
mysql_set_character_set(myfd, "utf8");
3.向数据库发起指令:
int mysql_query(MYSQL *mysql, const char *q);
成功时返回 0,失败时返回非 0 值,此时,以通过调用 mysql_error 函数来获取错误消息。参数说明:
-
mysql
: 指向已经成功连接的 MYSQL 结构体的指针。 -
q
: 要执行的 SQL 查询或命令的字符串,这个字符串应该以 NULL 结尾。
4.获取结果句柄:
如果我们执行的是update,insert等语句,我们只需要知道操作成功与否即可,但如果我们执行的是查询语句,我们还希望获取查询结果。当mysql_query返回成功时,我们通过mysql_store_result这个函数来读取结果的操作句柄:
MYSQL_RES *mysql_store_result(MYSQL *mysql);
成功时返回一个指向 MYSQL_RES 结构体的指针,该结构体包含了查询的全部结果集。失败时返回 NULL,此时可以通过调用 mysql_error 函数来获取错误消息。参数说明:
-
mysql
: 指向已经成功执行的查询的 MYSQL 结构体的指针。这个结构体应该已经通过 mysql_query 或其他类似的函数与 MySQL 服务器进行了交互。
该函数内部malloc了一片内存空间来存储查询过来的数据,所以我们使用完之后一定使用free()释放空间:
void mysql_free_result(MYSQL_RES *result);
5.获取查询结果的行数、列数:
my_ulonglong mysql_num_rows(MYSQL_RES *res);
unsigned int mysql_num_fields(MYSQL_RES *res);
6.获取列名:
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
int fields = mysql_num_fields(res);
MYSQL_FIELD *field = mysql_fetch_fields(res);
int i = 0;
for(; i < fields; i++){
cout<<field[i].name<<" ";
}
7.获取内容:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
获取查询到的结果的一条记录,它会自动指向下一条记录,返回的MYSQL_ROW其实就是char **
i = 0;
MYSQL_ROW line;
nums= mysql_num_rows(res);
fields=mysql_num_fields(res);
for(; i < nums; i++){
line = mysql_fetch_row(res);
int j = 0;
for(; j < fields; j++){
cout<<line[j]<<" ";
}
}
8.关闭mysql链接:
void mysql_close(MYSQL *sock);
mysql C api还支持事务等常用操作:
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);
最后我们了解一下一个网站的基本架构: