C中Mysql的基本api接口

2024-05-28 1253阅读

    • 一、初始化
      • 参数
      • 返回值
      • 二、链接服务器
      • 三、执行SQL语句
        • 注意事项
        • 四、获取结果集
          • 4.1mysql_affected_rows和mysql_num_rows
          • 4.2mysql_store_result与mysql_free_result
          • 注意事项
          • 注意事项
            • 整体的工作流程
            • 4.3mysql_use_result()
            • 4.4mysql_field_count()
            • 五、关闭MySQL
              • 使用和区别
              • 六、错误处理
                • mysql_errno()` 和 `mysql_error()

                  一、初始化

                  创建MYSQL* 对象,使用mysql_init函数

                  C中Mysql的基本api接口
                  (图片来源网络,侵删)
                  MYSQL * mysql;
                  mysql_init(mysql);
                  

                  参数

                  • mysql:指向一个 MYSQL 结构的指针。通常传递 NULL,系统将自动为您分配和初始化一个新的 MYSQL 对象。

                    返回值

                    • 成功:返回一个指向 MYSQL 结构的指针。
                    • 失败:返回 NULL。

                      二、链接服务器

                      使用函数mysql_real_connect();

                      MYSQL *mysql_real_connect(
                          MYSQL *mysql,           // mysql_init() 函数的返回值
                          const char *host,       // mysql服务器的主机地址, 写IP地址即可
                                                  // localhost, null -> 代表本地连接
                          const char *user,       // 连接mysql服务器的用户名, 默认: root 
                          const char *passwd,     // 连接mysql服务器用户对应的密码, root用户的密码
                          const char *db,         // 要使用的数据库的名字
                          unsigned int port,      // 连接的mysql服务器监听的端口
                                                  // 如果==0, 使用mysql的默认端口3306, !=0, 使用指定的这个端口
                          const char *unix_socket,// 本地套接字, 通常在 Windows 上使用命名管道,而在 Unix/Linux 系统上使用 Unix 套接字。如果不使用这类连接方式,此参数应设为 NULL。
                          unsigned long client_flag); //连接时使用的特定客户端标志 通常指定为0
                      )
                      

                      返回值:

                      • 成功:返回一个指向 MYSQL 结构的指针(通常是传入的那个指针)。
                      • 失败:返回 NULL,并且可以通过 mysql_error 函数来获取错误信息。

                        三、执行SQL语句

                        // 执行一个sql语句, 添删查改的sql语句都可以
                        int mysql_query(MYSQL *mysql, const char *query);
                        参数:
                            - mysql: mysql_real_connect() 的返回值
                            - query: 一个可以执行的sql语句, 结尾的位置不需要加 ;
                        返回值: 
                            - 如果查询成功,返回0。如果是查询, 结果集在mysql 对象中
                            - 如果出现错误,返回非0值。 
                        

                        注意事项

                        1. 资源管理:使用 mysql_query 后,如果查询是 SELECT 类型的,你通常需要调用 mysql_store_result 或 mysql_use_result 来处理返回的数据。记得在不需要结果集时使用 mysql_free_result 来释放内存。
                        2. 错误处理:在生产环境中,每次调用 mysql_query 后都应检查返回值,并适当处理错误。这样可以避免程序在错误状态下继续执行,导致更复杂的问题。
                        3. 安全性:避免将未经验证的用户输入直接用于 SQL 语句,以防止 SQL 注入攻击。考虑使用预处理语句和参数化查询来提高安全性。

                        这些基本的使用方式和注意事项可以帮助你有效地使用 mysql_query 来执行数据库操作。

                        值得注意的是在 MySQL 中,SQL 语句的关键字(如 SELECT, INSERT, UPDATE, DELETE 等)通常是不区分大小写的,这意味着 “select” 和 “SELECT” 在 MySQL 解释器看来是相同的。然而,数据库名称、表名、列名的大小写敏感性则取决于操作系统的文件系统和 MySQL 的配置。在 Unix、Linux 系统中,它们默认是大小写敏感的,而在 Windows 系统中默认是不敏感的。

                        mysql_query 实质上是在客户端和 MySQL 服务器之间进行网络通信的一个接口。在使用 TCP/IP 协议的情况下,客户端通过网络向服务器发送请求,并接收服务器的响应。这个过程涉及到网络数据的发送和接收,是基于客户端-服务器模型的典型应用。

                        要注意的是标准 SQL 查询:如果你的查询是简单的文本,不包含二进制数据,且不需要在 SQL 语句中嵌入 null 字符,使用 mysql_query 就足够了。

                        而当数据中有二进制数据就需要使用mysql_real_query

                        int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length);
                        
                        • 灵活性:可以执行包含 null 字符的查询,因为它要求用户明确提供查询的长度。
                        • 手动指定长度:用户必须指定查询字符串的长度,这允许函数处理二进制数据或包含 null 字符的数据。
                        • 适用场景:非常适合执行包含 BLOB 类型数据的 SQL 语句。

                          四、获取结果集

                          4.1mysql_affected_rows和mysql_num_rows

                          uint64_t mysql_affected_rows(MYSQL *mysql)
                          

                          mysql_affected_rows() 可能是 在使用 mysql_real_query() 或 mysql_query() 执行语句后立即调用。它返回 上一个更改、删除或插入的行数 语句(如果是 UPDATE、DELETE 或 INSERT)。对于 SELECT 语mysql_affected_rows() 有效 像 mysql_num_rows()。

                          对于 UPDATE 语句, 默认情况下,affected-rows 值是实际的行数 改变。如果在以下情况下指定 mysql_real_connect() 的标志 连接到 mysqld,受影响的行 value 是“找到”的行数;那是 与子句匹配。CLIENT_FOUND_ROWSWHERE

                          对于 REPLACE 语句, 如果新行替换了旧行,则 affected-rows 值为 2, 因为在这种情况下,在重复项之后插入了一行 已删除。

                          uint64_t mysql_num_rows(MYSQL_RES *result)
                          

                          返回结果集中的行数。

                          4.2mysql_store_result与mysql_free_result

                          MYSQL_RES *mysql_store_result(MYSQL *mysql);
                          参数说明
                          mysql: 指向 MYSQL 结构的指针,该结构体应已通过 mysql_real_connect 函数建立了与 MySQL 服务器的连接,并已成功执行了一个查询(如通过 mysql_query)。
                          返回值
                          成功: 返回一个指向 MYSQL_RES 结构的指针,这个结构包含了从服务器返回的所有结果数据。
                          失败 或 查询没有产生结果集(例如执行的是 UPDATE 或 DELETE 语句): 返回 NULL。
                          如何将行和列的数据从结果集中取出, 需要使用其他函数
                          

                          注:mysql_store_result 函数只会返回与最近一次通过 mysql_query (或其他发送 SQL 语句的函数)执行的查询相关的结果。它不会存储或回溯到之前的查询结果,而是专注于最后执行的查询。

                          注意事项

                          1. 内存管理:使用 mysql_store_result 后,必须在不再需要结果集时调用 mysql_free_result 来释放内存。
                          2. 性能考量:由于 mysql_store_result 会将所有结果数据存储在客户端内存中,对于返回大量数据的查询,这可能会消耗大量内存和网络资源。如果处理大型数据集,可能需要考虑使用 mysql_use_result,该函数允许逐行检索数据,从而减少内存占用。
                          3. 错误处理:始终检查 mysql_store_result 的返回值,并使用 mysql_error 函数来诊断错误。

                          通过 mysql_store_result,你可以方便地在客户端处理来自 MySQL 服务器的数据,但务必注意资源管理和错误处理,以确保应用程序的稳定性和效率。

                          void mysql_free_result(MYSQL_RES *result);
                          参数说明
                          result: 指向 MYSQL_RES 结构的指针,该结构包含了之前查询的结果集。
                          

                          mysql_free_result 函数是 MySQL C API 中用来释放由 mysql_store_result 或 mysql_use_result 函数分配的结果集内存的函数。这是清理和资源管理的重要一步,确保在查询处理完成后不会造成内存泄漏。

                          当使用 mysql_store_result 或 mysql_use_result 从 MySQL 服务器获取查询结果后,相关的数据会被存储在 MYSQL_RES 结构中。这个结构占用一定的内存空间,当数据处理完毕后,应该使用 mysql_free_result 来释放这些内存。如果不这样做,每次查询后未释放的内存会累积,最终可能导致内存不足或程序崩溃。

                          实际使用

                          #include 
                          #include 
                          int main() {
                              MYSQL *conn;
                              MYSQL_RES *res;
                              MYSQL_ROW row;
                              conn = mysql_init(NULL);
                              if (!conn) {
                                  std::cerr 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]