在 C 中访问 MySQL 数据库最常用的方式是通过官方提供的MySQL Connector/CC 驱动或基于C API的封装。MySQL Connector/C面向对象封装的库更加适配C也更方便。MySQL C API是面向过程封装的库主要用于需要兼容C语言的场景使用起来比较麻烦。1. MySQL C APIMySQL C API是 MySQL 提供的一套基于C 语言的底层接口用于与 MySQL 数据库进行交互。它是许多高层语言如 Python、PHP数据库驱动的底层实现功能全面但需要手动管理资源。使用 MySQL C API 的基本步骤初始化连接句柄 → 连接数据库 → 执行 SQL 语句 → 处理结果集 → 释放资源 → 关闭连接1.1 安装安装MySQL C 客户端开发库mysqlclientsudo apt-get update sudo apt-get install libmysqlclient-dev yum install mysql-community-devel dnf install mysql-connector-c-devel头文件路径/usr/include/mysql/mysql.h #include1.2 常用接口与使用方法1.2.1 初始化连接句柄MYSQL* mysql_init(MYSQL* mysql);功能初始化一个MYSQL 结构体连接句柄用于后续数据库操作。参数mysql若为 NULL函数会自动分配一个新的 MYSQL 结构体若传入已存在的句柄会重置其状态。返回值成功返回初始化后的 MYSQL* 句柄失败返回 NULL内存不足。1.2.2 连接数据库MYSQL* mysql_real_connect( MYSQL* mysql, // 已初始化的句柄 const char* host, // 主机名localhost或IP本地可填NULL const char* user, // 用户名如root const char* passwd, // 密码 const char* db, // 要连接的数据库名NULL表示不指定 unsigned int port, // 端口号默认3306填0表示默认 const char* unix_socket,// Unix域套接字NULL表示不使用 unsigned long client_flag // 客户端标志0表示默认 );功能通过初始化的句柄连接到 MySQL 服务器。返回值成功返回 mysql 句柄与传入的一致失败返回 NULL。1.2.3 执行 SQL 语句1mysql_queryint mysql_query(MYSQL* mysql, const char* stmt_str);功能执行字符串形式的 SQL 语句适合普通文本 SQL。参数stmt_str以 \0 结尾的 SQL 字符串如 SELECT * FROM user。返回值成功0失败非 0。2mysql_real_queryint mysql_real_query(MYSQL* mysql, const char* stmt_str, unsigned long length);功能执行 SQL 语句适合包含二进制数据或 \0 字符的 SQL需指定长度。参数lengthSQL 字符串的长度字节数。返回值与 mysql_query 一致。1.2.4 处理结果集执行查询语句如 SELECT后需通过以下函数获取并解析结果。MYSQL_RES查询语句的结果结果中的所有数据都以字符串的形式保存可抽象地认为这是一个存放字符串的二维数组表格。MYSQL_ROW查询结果中的一行数据本质是char**类型。typedef char **MYSQL_ROW; /* return data as array of strings */MYSQL_FIELD查询结果中一列属性本质是包含某列各种属性的结构体。typedef struct MYSQL_FIELD { char *name; /* Name of column */ char *org_name; /* Original column name, if an alias */ char *table; /* Table of column if column was a field */ char *org_table; /* Org table name, if table was an alias */ char *db; /* Database for table */ char *catalog; /* Catalog for table */ char *def; /* Default value (set by mysql_list_fields) */ unsigned long length; /* Width of column (create length) */ unsigned long max_length; /* Max width for selected set */ unsigned int name_length; unsigned int org_name_length; unsigned int table_length; unsigned int org_table_length; unsigned int db_length; unsigned int catalog_length; unsigned int def_length; unsigned int flags; /* Div flags */ unsigned int decimals; /* Number of decimals in field */ unsigned int charsetnr; /* Character set */ enum enum_field_types type; /* Type of field. See mysql_com.h for types */ void *extension; } MYSQL_FIELD;1获取结果集mysql_store_result原型MYSQL_RES* mysql_store_result(MYSQL* mysql)功能一次性将所有查询结果读取到客户端内存适合小结果集后续可随机访问。返回值成功返回结果集 MYSQL_RES*失败返回 NULL。mysql_use_result原型MYSQL_RES* mysql_use_result(MYSQL* mysql);功能逐行从服务器获取结果不缓存到客户端适合大结果集内存占用低但必须读完所有行才能执行新查询。返回值成功返回单行数据结果集失败返回 NULL。2获取行数与列数mysql_num_rows原型my_ulonglong mysql_num_rows(MYSQL_RES* result);功能获取结果集中的行数仅对 mysql_store_result 有效。mysql_num_fields原型unsigned int mysql_num_fields(MYSQL_RES* result);功能获取结果集中的列数。3获取行数据MYSQL_ROW mysql_fetch_row(MYSQL_RES* result);功能从结果集中获取一行数据以字符串数组形式返回。返回值成功返回 MYSQL_ROW本质是 char**每个元素对应一列的值NULL 表示该列值为 NULL无更多行或失败返回 NULL。4获取字段信息MYSQL_FIELD* mysql_fetch_field(MYSQL_RES* result);功能获取列的元信息如字段名、类型。返回值返回下一个字段的 MYSQL_FIELD 结构体包含 name、type 等成员无更多字段时返回 NULL。1.2.5 错误处理mysql_error原型const char* mysql_error(MYSQL* mysql);功能返回最后一次操作的错误信息字符串。mysql_errno原型unsigned int mysql_errno(MYSQL* mysql);功能返回最后一次操作的错误码整数可参考 MySQL 错误码表。1.2.6 关闭连接与释放资源mysql_close原型void mysql_close(MYSQL* mysql);功能关闭数据库连接并释放 MYSQL 句柄。mysql_free_result原型void mysql_free_result(MYSQL_RES* result);功能释放结果集必须在处理完结果后调用。1.3 使用示例#includestdio.h #includestring.h #include string #include iostream #include ostream #includemysql.h std::string host localhost; std::string user root; std::string password root,; std::string database mysql; unsigned int port 3306; int main() { // 初始化连接 MYSQL *conn mysql_init(nullptr); if(!mysql_real_connect(conn, host.c_str(), user.c_str(), password.c_str(), database.c_str(), port, nullptr, 0)) { std::cerr 建立连接失败! mysql_error(conn) std::endl; return 1; } // 查询 std::string sql SELECT * FROM user; if(mysql_query(conn, sql.c_str())) { std::cerr 查询失败! mysql_error(conn) std::endl; return 1; } // 处理结果 MYSQL_RES *res mysql_store_result(conn); my_ulonglong row_num mysql_num_rows(res); my_ulonglong col_num mysql_num_fields(res); MYSQL_FIELD *fild; while(fild mysql_fetch_field(res)) { std::cout fild-name \t; } std::cout std::endl; MYSQL_ROW row; while(row mysql_fetch_row(res)) { for(int i 0; i row_num; i) { std::cout row[i] \t; } std::cout std::endl; } // 释放资源 mysql_free_result(res); mysql_close(conn); return 0; }编译时需链接 MySQL C 客户端库-lmysqlclientg -o app main.cpp -I/usr/include/mysql -lmysqlcppconn./app[rootlocalhost ~]# vim main.cpp [rootlocalhost ~]# g -o app main.cpp -I/usr/include/mysql -lmysqlcppconn [rootlocalhost ~]# ./app 建立连接失败! Authentication plugin mysql_native_password cannot be loaded: /usr/lib64/mysql/plugin/mysql_native_password.so: cannot open shared object file: No such file or directory [rootlocalhost ~]# find / -name mysql_native_password.so /usr/lib64/mysql/libmysqlcppconn10/plugin/mysql_native_password.so [rootlocalhost ~]# cp /usr/lib64/mysql/libmysqlcppconn10/plugin/mysql_native_password.so /usr/lib64/mysql/plugin/ [rootlocalhost ~]# ./app Host User Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv Show_db_priv Super_priv Create_tmp_table_priv Lock_tables_priv Execute_priv Repl_slave_priv Repl_client_priv Create_view_priv Show_view_priv Create_routine_priv Alter_routine_priv Create_user_priv Event_priv Trigger_priv Create_tablespace_priv ssl_type ssl_cipher x509_issuer x509_subject max_questions max_updates max_connections max_user_connections plugin authentication_string password_expired password_last_changed password_lifetime account_locked localhost root Y Y localhost mysql.session N N localhost mysql.sys N N % root Y Y [rootlocalhost ~]#2.MySQL Connector/CMySQL Connector/C是 MySQL 官方提供的 C 驱动库用于在 C 程序中与 MySQL 数据库交互。它提供了两套主要接口传统 API基于 JDBC 风格的封装兼容旧版本 和X DevAPI现代面向对象接口支持关系型和文档型数据操作推荐使用。
MySQL笔记---C/C++访问MySQL数据库
发布时间:2026/6/11 15:13:28
在 C 中访问 MySQL 数据库最常用的方式是通过官方提供的MySQL Connector/CC 驱动或基于C API的封装。MySQL Connector/C面向对象封装的库更加适配C也更方便。MySQL C API是面向过程封装的库主要用于需要兼容C语言的场景使用起来比较麻烦。1. MySQL C APIMySQL C API是 MySQL 提供的一套基于C 语言的底层接口用于与 MySQL 数据库进行交互。它是许多高层语言如 Python、PHP数据库驱动的底层实现功能全面但需要手动管理资源。使用 MySQL C API 的基本步骤初始化连接句柄 → 连接数据库 → 执行 SQL 语句 → 处理结果集 → 释放资源 → 关闭连接1.1 安装安装MySQL C 客户端开发库mysqlclientsudo apt-get update sudo apt-get install libmysqlclient-dev yum install mysql-community-devel dnf install mysql-connector-c-devel头文件路径/usr/include/mysql/mysql.h #include1.2 常用接口与使用方法1.2.1 初始化连接句柄MYSQL* mysql_init(MYSQL* mysql);功能初始化一个MYSQL 结构体连接句柄用于后续数据库操作。参数mysql若为 NULL函数会自动分配一个新的 MYSQL 结构体若传入已存在的句柄会重置其状态。返回值成功返回初始化后的 MYSQL* 句柄失败返回 NULL内存不足。1.2.2 连接数据库MYSQL* mysql_real_connect( MYSQL* mysql, // 已初始化的句柄 const char* host, // 主机名localhost或IP本地可填NULL const char* user, // 用户名如root const char* passwd, // 密码 const char* db, // 要连接的数据库名NULL表示不指定 unsigned int port, // 端口号默认3306填0表示默认 const char* unix_socket,// Unix域套接字NULL表示不使用 unsigned long client_flag // 客户端标志0表示默认 );功能通过初始化的句柄连接到 MySQL 服务器。返回值成功返回 mysql 句柄与传入的一致失败返回 NULL。1.2.3 执行 SQL 语句1mysql_queryint mysql_query(MYSQL* mysql, const char* stmt_str);功能执行字符串形式的 SQL 语句适合普通文本 SQL。参数stmt_str以 \0 结尾的 SQL 字符串如 SELECT * FROM user。返回值成功0失败非 0。2mysql_real_queryint mysql_real_query(MYSQL* mysql, const char* stmt_str, unsigned long length);功能执行 SQL 语句适合包含二进制数据或 \0 字符的 SQL需指定长度。参数lengthSQL 字符串的长度字节数。返回值与 mysql_query 一致。1.2.4 处理结果集执行查询语句如 SELECT后需通过以下函数获取并解析结果。MYSQL_RES查询语句的结果结果中的所有数据都以字符串的形式保存可抽象地认为这是一个存放字符串的二维数组表格。MYSQL_ROW查询结果中的一行数据本质是char**类型。typedef char **MYSQL_ROW; /* return data as array of strings */MYSQL_FIELD查询结果中一列属性本质是包含某列各种属性的结构体。typedef struct MYSQL_FIELD { char *name; /* Name of column */ char *org_name; /* Original column name, if an alias */ char *table; /* Table of column if column was a field */ char *org_table; /* Org table name, if table was an alias */ char *db; /* Database for table */ char *catalog; /* Catalog for table */ char *def; /* Default value (set by mysql_list_fields) */ unsigned long length; /* Width of column (create length) */ unsigned long max_length; /* Max width for selected set */ unsigned int name_length; unsigned int org_name_length; unsigned int table_length; unsigned int org_table_length; unsigned int db_length; unsigned int catalog_length; unsigned int def_length; unsigned int flags; /* Div flags */ unsigned int decimals; /* Number of decimals in field */ unsigned int charsetnr; /* Character set */ enum enum_field_types type; /* Type of field. See mysql_com.h for types */ void *extension; } MYSQL_FIELD;1获取结果集mysql_store_result原型MYSQL_RES* mysql_store_result(MYSQL* mysql)功能一次性将所有查询结果读取到客户端内存适合小结果集后续可随机访问。返回值成功返回结果集 MYSQL_RES*失败返回 NULL。mysql_use_result原型MYSQL_RES* mysql_use_result(MYSQL* mysql);功能逐行从服务器获取结果不缓存到客户端适合大结果集内存占用低但必须读完所有行才能执行新查询。返回值成功返回单行数据结果集失败返回 NULL。2获取行数与列数mysql_num_rows原型my_ulonglong mysql_num_rows(MYSQL_RES* result);功能获取结果集中的行数仅对 mysql_store_result 有效。mysql_num_fields原型unsigned int mysql_num_fields(MYSQL_RES* result);功能获取结果集中的列数。3获取行数据MYSQL_ROW mysql_fetch_row(MYSQL_RES* result);功能从结果集中获取一行数据以字符串数组形式返回。返回值成功返回 MYSQL_ROW本质是 char**每个元素对应一列的值NULL 表示该列值为 NULL无更多行或失败返回 NULL。4获取字段信息MYSQL_FIELD* mysql_fetch_field(MYSQL_RES* result);功能获取列的元信息如字段名、类型。返回值返回下一个字段的 MYSQL_FIELD 结构体包含 name、type 等成员无更多字段时返回 NULL。1.2.5 错误处理mysql_error原型const char* mysql_error(MYSQL* mysql);功能返回最后一次操作的错误信息字符串。mysql_errno原型unsigned int mysql_errno(MYSQL* mysql);功能返回最后一次操作的错误码整数可参考 MySQL 错误码表。1.2.6 关闭连接与释放资源mysql_close原型void mysql_close(MYSQL* mysql);功能关闭数据库连接并释放 MYSQL 句柄。mysql_free_result原型void mysql_free_result(MYSQL_RES* result);功能释放结果集必须在处理完结果后调用。1.3 使用示例#includestdio.h #includestring.h #include string #include iostream #include ostream #includemysql.h std::string host localhost; std::string user root; std::string password root,; std::string database mysql; unsigned int port 3306; int main() { // 初始化连接 MYSQL *conn mysql_init(nullptr); if(!mysql_real_connect(conn, host.c_str(), user.c_str(), password.c_str(), database.c_str(), port, nullptr, 0)) { std::cerr 建立连接失败! mysql_error(conn) std::endl; return 1; } // 查询 std::string sql SELECT * FROM user; if(mysql_query(conn, sql.c_str())) { std::cerr 查询失败! mysql_error(conn) std::endl; return 1; } // 处理结果 MYSQL_RES *res mysql_store_result(conn); my_ulonglong row_num mysql_num_rows(res); my_ulonglong col_num mysql_num_fields(res); MYSQL_FIELD *fild; while(fild mysql_fetch_field(res)) { std::cout fild-name \t; } std::cout std::endl; MYSQL_ROW row; while(row mysql_fetch_row(res)) { for(int i 0; i row_num; i) { std::cout row[i] \t; } std::cout std::endl; } // 释放资源 mysql_free_result(res); mysql_close(conn); return 0; }编译时需链接 MySQL C 客户端库-lmysqlclientg -o app main.cpp -I/usr/include/mysql -lmysqlcppconn./app[rootlocalhost ~]# vim main.cpp [rootlocalhost ~]# g -o app main.cpp -I/usr/include/mysql -lmysqlcppconn [rootlocalhost ~]# ./app 建立连接失败! Authentication plugin mysql_native_password cannot be loaded: /usr/lib64/mysql/plugin/mysql_native_password.so: cannot open shared object file: No such file or directory [rootlocalhost ~]# find / -name mysql_native_password.so /usr/lib64/mysql/libmysqlcppconn10/plugin/mysql_native_password.so [rootlocalhost ~]# cp /usr/lib64/mysql/libmysqlcppconn10/plugin/mysql_native_password.so /usr/lib64/mysql/plugin/ [rootlocalhost ~]# ./app Host User Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv Show_db_priv Super_priv Create_tmp_table_priv Lock_tables_priv Execute_priv Repl_slave_priv Repl_client_priv Create_view_priv Show_view_priv Create_routine_priv Alter_routine_priv Create_user_priv Event_priv Trigger_priv Create_tablespace_priv ssl_type ssl_cipher x509_issuer x509_subject max_questions max_updates max_connections max_user_connections plugin authentication_string password_expired password_last_changed password_lifetime account_locked localhost root Y Y localhost mysql.session N N localhost mysql.sys N N % root Y Y [rootlocalhost ~]#2.MySQL Connector/CMySQL Connector/C是 MySQL 官方提供的 C 驱动库用于在 C 程序中与 MySQL 数据库交互。它提供了两套主要接口传统 API基于 JDBC 风格的封装兼容旧版本 和X DevAPI现代面向对象接口支持关系型和文档型数据操作推荐使用。