C语言操作MySQL从入门到精通

news2025/3/13 12:45:31

大家好,我是 V 哥。今天给大家整理的内容是关于使用 C 语言操作 MySQL 数据库的详细介绍,从入门到精通,并配有案例代码和注释,帮助小白快速上手。

基本操作

1. 环境准备

在开始之前,你需要安装 MySQL 数据库和 MySQL Connector/C 开发库。以 Ubuntu 系统为例,可以使用以下命令进行安装:

sudo apt-get update
sudo apt-get install mysql-server libmysqlclient-dev

2. 入门:连接到 MySQL 数据库

以下是一个简单的 C 语言程序,用于连接到 MySQL 数据库:

#include <mysql/mysql.h>
#include <stdio.h>

int main() {
    // 初始化 MySQL 连接对象
    MYSQL *conn = mysql_init(NULL);

    if (conn == NULL) {
        // 初始化失败,输出错误信息
        fprintf(stderr, "mysql_init() failed\n");
        return 1;
    }

    // 尝试连接到 MySQL 数据库
    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        // 连接失败,输出错误信息
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        // 关闭连接
        mysql_close(conn);
        return 1;
    }

    printf("Connected to MySQL successfully!\n");

    // 关闭连接
    mysql_close(conn);

    return 0;
}

代码解释

  • mysql_init(NULL):初始化一个 MySQL 连接对象。
  • mysql_real_connect():尝试连接到指定的 MySQL 数据库。需要提供主机名、用户名、密码、数据库名等信息。
  • mysql_error(conn):获取 MySQL 操作的错误信息。
  • mysql_close(conn):关闭 MySQL 连接。

3. 执行 SQL 查询语句

以下是一个执行简单 SQL 查询语句的示例:

#include <mysql/mysql.h>
#include <stdio.h>

int main() {
    MYSQL *conn = mysql_init(NULL);

    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        return 1;
    }

    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    // 定义要执行的 SQL 查询语句
    const char *query = "SELECT * FROM your_table";

    // 执行 SQL 查询语句
    if (mysql_query(conn, query) != 0) {
        // 查询失败,输出错误信息
        fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    // 获取查询结果集
    MYSQL_RES *result = mysql_store_result(conn);

    if (result == NULL) {
        // 获取结果集失败,输出错误信息
        fprintf(stderr, "mysql_store_result() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    // 获取结果集中的行数和列数
    int num_fields = mysql_num_fields(result);
    MYSQL_ROW row;

    // 遍历结果集
    while ((row = mysql_fetch_row(result))) {
        for(int i = 0; i < num_fields; i++) {
            // 输出每一行的每一列数据
            printf("%s ", row[i] ? row[i] : "NULL");
        }
        printf("\n");
    }

    // 释放结果集
    mysql_free_result(result);
    // 关闭连接
    mysql_close(conn);

    return 0;
}

代码解释

  • mysql_query(conn, query):执行指定的 SQL 查询语句。
  • mysql_store_result(conn):将查询结果存储在内存中,并返回一个结果集对象。
  • mysql_num_fields(result):获取结果集中的列数。
  • mysql_fetch_row(result):从结果集中获取下一行数据。
  • mysql_free_result(result):释放结果集占用的内存。

4. 插入数据

以下是一个向数据库中插入数据的示例:

#include <mysql/mysql.h>
#include <stdio.h>
#include <string.h>

int main() {
    MYSQL *conn = mysql_init(NULL);

    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        return 1;
    }

    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    // 定义要插入的数据
    const char *name = "John Doe";
    int age = 30;

    // 构建插入 SQL 语句
    char query[256];
    snprintf(query, sizeof(query), "INSERT INTO your_table (name, age) VALUES ('%s', %d)", name, age);

    // 执行插入操作
    if (mysql_query(conn, query) != 0) {
        fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    printf("Data inserted successfully!\n");

    // 关闭连接
    mysql_close(conn);

    return 0;
}

代码解释

  • 使用 snprintf() 函数构建插入 SQL 语句。
  • mysql_query(conn, query):执行插入 SQL 语句。

5. 更新和删除数据

更新数据
#include <mysql/mysql.h>
#include <stdio.h>
#include <string.h>

int main() {
    MYSQL *conn = mysql_init(NULL);

    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        return 1;
    }

    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    // 构建更新 SQL 语句
    char query[256];
    snprintf(query, sizeof(query), "UPDATE your_table SET age = 31 WHERE name = 'John Doe'");

    // 执行更新操作
    if (mysql_query(conn, query) != 0) {
        fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    printf("Data updated successfully!\n");

    // 关闭连接
    mysql_close(conn);

    return 0;
}
删除数据
#include <mysql/mysql.h>
#include <stdio.h>
#include <string.h>

int main() {
    MYSQL *conn = mysql_init(NULL);

    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        return 1;
    }

    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    // 构建删除 SQL 语句
    char query[256];
    snprintf(query, sizeof(query), "DELETE FROM your_table WHERE name = 'John Doe'");

    // 执行删除操作
    if (mysql_query(conn, query) != 0) {
        fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    printf("Data deleted successfully!\n");

    // 关闭连接
    mysql_close(conn);

    return 0;
}

6. 错误处理和资源管理

在实际开发中,需要更加完善的错误处理和资源管理机制。例如,可以将数据库连接和操作封装成函数,方便复用和管理。

#include <mysql/mysql.h>
#include <stdio.h>
#include <string.h>

// 连接到 MySQL 数据库
MYSQL* connect_to_mysql() {
    MYSQL *conn = mysql_init(NULL);

    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        return NULL;
    }

    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return NULL;
    }

    return conn;
}

// 执行 SQL 查询语句
int execute_query(MYSQL *conn, const char *query) {
    if (mysql_query(conn, query) != 0) {
        fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
        return 1;
    }
    return 0;
}

int main() {
    MYSQL *conn = connect_to_mysql();

    if (conn == NULL) {
        return 1;
    }

    const char *query = "SELECT * FROM your_table";
    if (execute_query(conn, query) != 0) {
        mysql_close(conn);
        return 1;
    }

    MYSQL_RES *result = mysql_store_result(conn);

    if (result == NULL) {
        fprintf(stderr, "mysql_store_result() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    int num_fields = mysql_num_fields(result);
    MYSQL_ROW row;

    while ((row = mysql_fetch_row(result))) {
        for(int i = 0; i < num_fields; i++) {
            printf("%s ", row[i] ? row[i] : "NULL");
        }
        printf("\n");
    }

    mysql_free_result(result);
    mysql_close(conn);

    return 0;
}

通过以上步骤,你可以逐步掌握使用 C 语言操作 MySQL 数据库的基本方法,从连接数据库、执行查询、插入数据到更新和删除数据,并且学会了基本的错误处理和资源管理。

在C语言中,如何处理MySQL数据库连接错误?

在 C 语言中使用 MySQL 数据库时,数据库连接可能会因为各种原因失败,如网络问题、用户名密码错误、数据库服务未启动等。以下是详细介绍如何处理 MySQL 数据库连接错误的方法,并配有示例代码。

1. 连接过程及错误处理概述

在使用 C 语言连接 MySQL 数据库时,主要使用 mysql_init() 函数初始化 MySQL 连接对象,然后使用 mysql_real_connect() 函数尝试建立与数据库的连接。这两个函数都可能出现错误,需要进行相应的错误处理。

2. 具体错误处理方法

2.1 mysql_init() 函数错误处理

mysql_init() 函数用于初始化一个 MySQL 连接对象,如果初始化失败,会返回 NULL。可以通过检查返回值来判断是否初始化成功。

#include <mysql/mysql.h>
#include <stdio.h>

int main() {
    MYSQL *conn = mysql_init(NULL);
    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed: Memory allocation error\n");
        return 1;
    }
    // 后续连接操作
    // ...
    mysql_close(conn);
    return 0;
}

在上述代码中,如果 mysql_init() 返回 NULL,说明内存分配失败,程序会输出错误信息并退出。

2.2 mysql_real_connect() 函数错误处理

mysql_real_connect() 函数用于建立与 MySQL 数据库的连接,如果连接失败,会返回 NULL。可以使用 mysql_error() 函数获取具体的错误信息。

#include <mysql/mysql.h>
#include <stdio.h>

int main() {
    MYSQL *conn = mysql_init(NULL);
    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed: Memory allocation error\n");
        return 1;
    }

    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    printf("Connected to MySQL successfully!\n");

    mysql_close(conn);
    return 0;
}

在上述代码中,如果 mysql_real_connect() 返回 NULL,说明连接失败,程序会使用 mysql_error() 函数获取错误信息并输出,然后关闭连接并退出。

2.3 常见错误及处理建议
  • 网络问题:如果错误信息提示无法连接到数据库服务器,可能是网络问题。可以检查数据库服务器的 IP 地址和端口号是否正确,以及网络是否正常。
  • 用户名或密码错误:如果错误信息提示认证失败,可能是用户名或密码错误。可以检查用户名和密码是否正确。
  • 数据库不存在:如果错误信息提示数据库不存在,可能是指定的数据库名错误。可以检查数据库名是否正确。

3. 更完善的错误处理示例

以下是一个更完善的示例,包含了重试机制和详细的错误处理:

#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define MAX_RETRIES 3

int main() {
    MYSQL *conn = mysql_init(NULL);
    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed: Memory allocation error\n");
        return 1;
    }

    int retries = 0;
    while (retries < MAX_RETRIES) {
        if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) != NULL) {
            printf("Connected to MySQL successfully!\n");
            // 执行数据库操作
            // ...
            mysql_close(conn);
            return 0;
        }

        fprintf(stderr, "mysql_real_connect() failed (attempt %d/%d): %s\n", retries + 1, MAX_RETRIES, mysql_error(conn));
        retries++;
        if (retries < MAX_RETRIES) {
            // 等待一段时间后重试
            sleep(2);
        }
    }

    fprintf(stderr, "Failed to connect to MySQL after %d attempts.\n", MAX_RETRIES);
    mysql_close(conn);
    return 1;
}

在上述代码中,使用了一个重试机制,当连接失败时,会尝试重新连接,最多重试 MAX_RETRIES 次,每次重试之间等待 2 秒。如果多次重试后仍然失败,程序会输出错误信息并退出。

通过以上方法,可以在 C 语言中有效地处理 MySQL 数据库连接错误,提高程序的健壮性。

如何在C语言中优化MySQL数据库操作的性能?

在 C 语言中优化 MySQL 数据库操作的性能可以从多个方面入手,下面将从数据库连接管理、SQL 语句优化、数据处理与传输优化以及使用预处理语句等方面详细介绍:

1. 数据库连接管理

1.1 减少连接建立与关闭次数

频繁地建立和关闭数据库连接会带来较大的开销,因此应尽量复用已有的连接。可以采用连接池的思想,在程序启动时建立一定数量的数据库连接,后续操作从连接池中获取连接,使用完毕后归还连接,而不是每次操作都重新建立连接。

以下是一个简单的连接复用示例:

#include <mysql/mysql.h>
#include <stdio.h>

MYSQL *conn;

void init_connection() {
    conn = mysql_init(NULL);
    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        return;
    }
    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return;
    }
}

void close_connection() {
    mysql_close(conn);
}

int main() {
    init_connection();
    // 执行多次数据库操作
    const char *query1 = "SELECT * FROM your_table";
    if (mysql_query(conn, query1) != 0) {
        fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
    }
    const char *query2 = "INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2')";
    if (mysql_query(conn, query2) != 0) {
        fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
    }
    close_connection();
    return 0;
}
1.2 合理设置连接超时时间

mysql_real_connect 函数中可以设置连接超时时间,避免长时间等待无响应的连接请求。

MYSQL *conn = mysql_init(NULL);
if (conn != NULL) {
    mysql_options(conn, MYSQL_OPT_CONNECT_TIMEOUT, &(unsigned int){5}); // 设置连接超时时间为 5 秒
    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
    }
}

2. SQL 语句优化

2.1 避免使用 SELECT *

只选择需要的列,减少数据传输量和数据库处理开销。例如:

const char *query = "SELECT column1, column2 FROM your_table WHERE condition";
if (mysql_query(conn, query) != 0) {
    fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
}
2.2 合理使用索引

在数据库表中为经常用于查询条件、排序和连接的列创建索引,能显著提高查询速度。在 C 语言代码中,确保 SQL 查询语句能够利用这些索引。例如,如果 your_table 表的 column1 列上有索引,查询时使用该列作为条件:

const char *query = "SELECT column1, column2 FROM your_table WHERE column1 = 'value'";
if (mysql_query(conn, query) != 0) {
    fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
}
2.3 批量操作

对于插入、更新和删除操作,尽量使用批量操作。例如,批量插入数据:

const char *query = "INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2'), ('value3', 'value4')";
if (mysql_query(conn, query) != 0) {
    fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
}

3. 数据处理与传输优化

3.1 减少不必要的数据传输

在查询数据时,根据实际需求进行过滤和排序,避免将大量不必要的数据从数据库传输到应用程序。例如,使用 LIMIT 关键字限制返回的记录数:

const char *query = "SELECT column1, column2 FROM your_table WHERE condition LIMIT 10";
if (mysql_query(conn, query) != 0) {
    fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
}
3.2 优化数据类型

在数据库表设计时,选择合适的数据类型,避免使用过大的数据类型,以减少数据存储和传输的开销。在 C 语言中,正确处理不同的数据类型,避免数据类型转换带来的性能损失。

4. 使用预处理语句

预处理语句可以减少 SQL 语句的解析和编译次数,提高多次执行相同结构 SQL 语句的性能。以下是一个使用预处理语句插入数据的示例:

#include <mysql/mysql.h>
#include <stdio.h>

int main() {
    MYSQL *conn = mysql_init(NULL);
    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        return 1;
    }
    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    MYSQL_STMT *stmt = mysql_stmt_init(conn);
    if (stmt == NULL) {
        fprintf(stderr, "mysql_stmt_init() failed\n");
        mysql_close(conn);
        return 1;
    }

    const char *query = "INSERT INTO your_table (column1, column2) VALUES (?, ?)";
    if (mysql_stmt_prepare(stmt, query, strlen(query)) != 0) {
        fprintf(stderr, "mysql_stmt_prepare() failed: %s\n", mysql_stmt_error(stmt));
        mysql_stmt_close(stmt);
        mysql_close(conn);
        return 1;
    }

    MYSQL_BIND bind[2];
    memset(bind, 0, sizeof(bind));

    char value1[20] = "test_value1";
    char value2[20] = "test_value2";

    bind[0].buffer_type = MYSQL_TYPE_STRING;
    bind[0].buffer = value1;
    bind[0].buffer_length = strlen(value1);

    bind[1].buffer_type = MYSQL_TYPE_STRING;
    bind[1].buffer = value2;
    bind[1].buffer_length = strlen(value2);

    if (mysql_stmt_bind_param(stmt, bind) != 0) {
        fprintf(stderr, "mysql_stmt_bind_param() failed: %s\n", mysql_stmt_error(stmt));
        mysql_stmt_close(stmt);
        mysql_close(conn);
        return 1;
    }

    if (mysql_stmt_execute(stmt) != 0) {
        fprintf(stderr, "mysql_stmt_execute() failed: %s\n", mysql_stmt_error(stmt));
    }

    mysql_stmt_close(stmt);
    mysql_close(conn);
    return 0;
}

通过上述方法,可以在 C 语言中有效地优化 MySQL 数据库操作的性能。

最后

以上是 V 哥整理的在 C 语言开发中,操作 MySQL 数据库的案例讲解,希望可以帮助大家在学习 C 语言时能够快速上手,关注威哥爱编程,全栈开发就你行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

化工厂防爆气象站:为石油化工、天然气等领域提供安全保障

【TH-FB02】在石油化工、天然气等高危行业中&#xff0c;安全生产是至关重要的。这些行业常常面临着易燃易爆、有毒有害等潜在风险&#xff0c;因此&#xff0c;对气象条件的监测和预警显得尤为重要。化工厂防爆气象站作为一种专门设计用于这些特殊环境的气象监测设备&#xff…

《A Gentle Introduction to Graph Neural Networks》-GNN的综述性论文

目录 一、什么数据可以表示成一张图 &#xff08;1&#xff09;什么是图&#xff1f; &#xff08;2&#xff09;如何表示图的属性 &#xff08;3&#xff09;images as graphs&#xff08;将图片表示为图&#xff09; &#xff08;4&#xff09;text as graphs&#xff08…

[023-01-40].第40节:组件应用 - OpenFeign与 Sentinel 集成实现fallback服务降级

SpringCloud学习大纲 一、需求说明&#xff1a; 需求1&#xff1a;通过fallback属性进行统一配置 a.问题分析&#xff1a; 1.需要实现cloudalibaba-consumer-nacos-order83模块通过OpenFeign调用cloudalibaba-provider-payment9001 83服务通过OpenFeign调用 9001微服务&…

设计模式-结构型模式-装饰器模式

概述 装饰器模式 : Decorator Pattern : 是一种结构型设计模式. 作用 &#xff1a; 允许你动态地给对象添加功能或职责&#xff0c;而无需修改其原始类的代码,非常的符合 开闭原则。 实现思路 &#xff1a;通过创建一个包装对象&#xff08;即装饰器&#xff09;&#xff0c;来…

visual studio配置opencv

文章目录 step1 下载opencvstep2 配置包含目录step 3 配置链接器step4 配置环境变量并重启vs2022step5 检查代码 step1 下载opencv 下载 opencv-4.8.0-windows.exe https://cloud.189.cn/web/share?codefUnqEb7naUra step2 配置包含目录 step 3 配置链接器 step4 配置环境变…

docker修改daemon.json文件后无法启动

1.问题描述 使用阿里云docker镜像安装的docker&#xff0c;安装成功后默认可以启动。但是修改daemon.json配置后docker服务无法启动&#xff0c;提示如下错误&#xff1a; 从上图发现&#xff0c;docker服务默认使用阿里docker镜像仓库 2.解决方法 根据提示找到docker服务目…

Linux网络:网络与操作系统1

本文是介绍网络的基本结构&#xff0c;以及和OS之间有什么关系 OSI七层模型 引入 使用网络是为了解决信息的长距离传送&#xff0c;那就需要解决四个问题&#xff1a; 接收方如何使用数据传输的可靠性主机如何定位数据包在局域网如何转发 人们选择用网络协议&#xff08;t…

姚安娜新剧瘦了一圈,《仁心俱乐部》急诊医生顾诗宜在线上岗

《仁心俱乐部》在芒果 TV 播出&#xff0c;湖南卫视金鹰独播剧场也随之播出&#xff0c;这一剧集受到了不少观众的关注。姚安娜在剧中饰演的急诊科医生顾诗宜&#xff0c;她为患者检查身体时动作娴熟&#xff0c;与患者沟通时展现出的耐心和专注&#xff0c;都展现出很高的专业…

串口数据记录仪DIY,体积小,全开源

作用 产品到客户现场出现异常情况&#xff0c;这个时候就需要一个日志记录仪、黑匣子&#xff0c;可以记录产品的工作情况&#xff0c;当出现异常时&#xff0c;可以搜集到上下文的数据&#xff0c;从而判断问题原因。 之前从网上买过&#xff0c;但是出现过丢数据的情况耽误…

51单片机Proteus仿真速成教程——P1-软件与配置+Proteus绘制51单片机最小系统+新建程序模版

前言&#xff1a;本文主要围绕 51 单片机最小系统的绘制及程序模板创建展开。首先介绍了使用 Proteus 绘制 51 单片机最小系统的详细步骤&#xff0c;包括软件安装获取途径、工程创建、器件添加&#xff08;如单片机 AT89C51、晶振、电容、电阻、按键等&#xff09;、外围电路&…

使用 pytesseract 进行 OCR 识别:以固定区域经纬度提取为例

引言 在智能交通、地图定位等应用场景中&#xff0c;经常会遇到需要从图像中提取经纬度信息的需求。本篇文章将介绍如何利用 Python 的 pytesseract 库结合 PIL 对图像进行预处理&#xff0c;通过固定区域裁剪&#xff0c;来有效地识别出图像上显示的经纬度信息。 1. OCR 与 …

【51单片机】程序实验15.DS18B20温度传感器

主要参考学习资料&#xff1a;B站【普中官方】51单片机手把手教学视频 开发资料下载链接&#xff1a;http://www.prechin.cn/gongsixinwen/208.html 单片机套装&#xff1a;普中STC51单片机开发板A4标准版套餐7 目录 DS18B20介绍主要特性内部结构控制时序初始化时序写时序读时序…

Vue项目上传到GitHub,vscode拉取vue项目更新后推送到GitHub上

1、新建Vue项目 2、在GitHub新建仓库 3、留意建立好仓库后提示的命令 4、进入vue项目目录&#xff0c;在空白处点击鼠标右键选择git bash here 5、输入命令 git init git add . git commit -m "注释内容" 输入之前创建GitHub仓库后记下的代码的第一句 git remote…

InternVL:论文阅读 -- 多模态大模型(视觉语言模型)

更多内容&#xff1a;XiaoJ的知识星球 文章目录 InternVL: 扩展视觉基础模型与通用视觉语言任务对齐1.概述2.InternVL整体架构1&#xff09;大型视觉编码器&#xff1a;InternViT-6B2&#xff09;语言中间件&#xff1a;QLLaMA。3&#xff09;训练策略&#xff08;1&#xff09…

【BUG】类文件具有错误的版本 61.0, 应为 52.0,请删除该文件或确保该文件位于正确的类路径子目录中。

报错&#xff1a; [ERROR] 类文件具有错误的版本 61.0, 应为 52.0 [ERROR] 请删除该文件或确保该文件位于正确的类路径子目录中。 报错截图&#xff1a; 原因&#xff1a;Java 版本和 Spring 不兼容&#xff0c;显示 Spring 版本过高 解决方法 1. 使用更高版本的 J…

康谋应用 | 基于多传感器融合的海洋数据采集系统

在海洋监测领域&#xff0c;基于无人艇能够实现高效、实时、自动化的海洋数据采集&#xff0c;从而为海洋环境保护、资源开发等提供有力支持。其中&#xff0c;无人艇的控制算法训练往往需要大量高质量的数据支持。然而&#xff0c;海洋数据采集也面临数据噪声和误差、数据融合…

双周报Vol.67: 模式匹配支持守卫、LLVM 后端发布、支持 Attribute 语法...多项核心技术更新!

2025-03-10 语言更新 模式匹配支持守卫&#xff08;Pattern Guard&#xff09; 模式守卫可以通过在模式后追加 if ... 的语法结构来指定。有模式守卫的分支只有在被模式匹配的值满足对应模式&#xff0c;并且模式守卫为真的情况下才会执行。如果模式守卫为假&#xff0c;则会…

MCP-代码解读TypeScript版本

MCP-代码解读TypeScript版本 文章目录 MCP-代码解读TypeScript版本1-参考网址2-TypeScript代码3-代码解读1-[非重点]定义函数2-[非重点]定义工具说明3-[重点]运行MCP服务 1-参考网址 B站视频参考 2-TypeScript代码 import { McpServer } from "modelcontextprotocol/sd…

写了一个二叉树构造函数和画图函数,方便debug

代码 class TreeNode(object):def __init__(self, val, leftNone, rightNone):self.val valself.left leftself.right rightdef construct_tree(nodes):if not nodes:return Noneroot TreeNode(nodes[0])queue [root]index 1while index < len(nodes):node queue.p…

docker 小记

一、卸载 查看当前版本 docker -v2. 如果有&#xff0c;先停止docker systemctl stop docker如果是yum安装&#xff0c;卸载方式为 #已防版本冲突&#xff0c;直接卸载 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-lat…