C語言操作MySQL從入門到精通

大家好,我是 V 哥。今天給大家整理的內(nèi)容是關(guān)于使用 C 語言操作 MySQL 數(shù)據(jù)庫(kù)的詳細(xì)介紹,從入門到精通,并配有案例代碼和注釋,幫助小白快速上手。

基本操作

1. 環(huán)境準(zhǔn)備

在開始之前,你需要安裝 MySQL 數(shù)據(jù)庫(kù)和 MySQL Connector/C 開發(fā)庫(kù)。以 Ubuntu 系統(tǒng)為例,可以使用以下命令進(jìn)行安裝:

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

2. 入門:連接到 MySQL 數(shù)據(jù)庫(kù)

以下是一個(gè)簡(jiǎn)單的 C 語言程序,用于連接到 MySQL 數(shù)據(jù)庫(kù):

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

int main() {
    // 初始化 MySQL 連接對(duì)象
    MYSQL *conn = mysql_init(NULL);

    if (conn == NULL) {
        // 初始化失敗,輸出錯(cuò)誤信息
        fprintf(stderr, "mysql_init() failed\n");
        return 1;
    }

    // 嘗試連接到 MySQL 數(shù)據(jù)庫(kù)
    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        // 連接失敗,輸出錯(cuò)誤信息
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        // 關(guān)閉連接
        mysql_close(conn);
        return 1;
    }

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

    // 關(guān)閉連接
    mysql_close(conn);

    return 0;
}

代碼解釋

  • mysql_init(NULL):初始化一個(gè) MySQL 連接對(duì)象。
  • mysql_real_connect():嘗試連接到指定的 MySQL 數(shù)據(jù)庫(kù)。需要提供主機(jī)名、用戶名、密碼、數(shù)據(jù)庫(kù)名等信息。
  • mysql_error(conn):獲取 MySQL 操作的錯(cuò)誤信息。
  • mysql_close(conn):關(guān)閉 MySQL 連接。

3. 執(zhí)行 SQL 查詢語句

以下是一個(gè)執(zhí)行簡(jiǎn)單 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;
    }

    // 定義要執(zhí)行的 SQL 查詢語句
    const char *query = "SELECT * FROM your_table";

    // 執(zhí)行 SQL 查詢語句
    if (mysql_query(conn, query) != 0) {
        // 查詢失敗,輸出錯(cuò)誤信息
        fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    // 獲取查詢結(jié)果集
    MYSQL_RES *result = mysql_store_result(conn);

    if (result == NULL) {
        // 獲取結(jié)果集失敗,輸出錯(cuò)誤信息
        fprintf(stderr, "mysql_store_result() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    // 獲取結(jié)果集中的行數(shù)和列數(shù)
    int num_fields = mysql_num_fields(result);
    MYSQL_ROW row;

    // 遍歷結(jié)果集
    while ((row = mysql_fetch_row(result))) {
        for(int i = 0; i < num_fields; i++) {
            // 輸出每一行的每一列數(shù)據(jù)
            printf("%s ", row[i] ? row[i] : "NULL");
        }
        printf("\n");
    }

    // 釋放結(jié)果集
    mysql_free_result(result);
    // 關(guān)閉連接
    mysql_close(conn);

    return 0;
}

代碼解釋

  • mysql_query(conn, query):執(zhí)行指定的 SQL 查詢語句。
  • mysql_store_result(conn):將查詢結(jié)果存儲(chǔ)在內(nèi)存中,并返回一個(gè)結(jié)果集對(duì)象。
  • mysql_num_fields(result):獲取結(jié)果集中的列數(shù)。
  • mysql_fetch_row(result):從結(jié)果集中獲取下一行數(shù)據(jù)。
  • mysql_free_result(result):釋放結(jié)果集占用的內(nèi)存。

4. 插入數(shù)據(jù)

以下是一個(gè)向數(shù)據(jù)庫(kù)中插入數(shù)據(jù)的示例:

#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;
    }

    // 定義要插入的數(shù)據(jù)
    const char *name = "John Doe";
    int age = 30;

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

    // 執(zhí)行插入操作
    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");

    // 關(guān)閉連接
    mysql_close(conn);

    return 0;
}

代碼解釋

  • 使用 snprintf() 函數(shù)構(gòu)建插入 SQL 語句。
  • mysql_query(conn, query):執(zhí)行插入 SQL 語句。

5. 更新和刪除數(shù)據(jù)

更新數(shù)據(jù)

#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;
    }

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

    // 執(zhí)行更新操作
    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");

    // 關(guān)閉連接
    mysql_close(conn);

    return 0;
}

刪除數(shù)據(jù)

#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;
    }

    // 構(gòu)建刪除 SQL 語句
    char query[256];
    snprintf(query, sizeof(query), "DELETE FROM your_table WHERE name = 'John Doe'");

    // 執(zhí)行刪除操作
    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");

    // 關(guān)閉連接
    mysql_close(conn);

    return 0;
}

6. 錯(cuò)誤處理和資源管理

在實(shí)際開發(fā)中,需要更加完善的錯(cuò)誤處理和資源管理機(jī)制。例如,可以將數(shù)據(jù)庫(kù)連接和操作封裝成函數(shù),方便復(fù)用和管理。

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

// 連接到 MySQL 數(shù)據(jù)庫(kù)
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;
}

// 執(zhí)行 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 數(shù)據(jù)庫(kù)的基本方法,從連接數(shù)據(jù)庫(kù)、執(zhí)行查詢、插入數(shù)據(jù)到更新和刪除數(shù)據(jù),并且學(xué)會(huì)了基本的錯(cuò)誤處理和資源管理。

在C語言中,如何處理MySQL數(shù)據(jù)庫(kù)連接錯(cuò)誤?

在 C 語言中使用 MySQL 數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)庫(kù)連接可能會(huì)因?yàn)楦鞣N原因失敗,如網(wǎng)絡(luò)問題、用戶名密碼錯(cuò)誤、數(shù)據(jù)庫(kù)服務(wù)未啟動(dòng)等。以下是詳細(xì)介紹如何處理 MySQL 數(shù)據(jù)庫(kù)連接錯(cuò)誤的方法,并配有示例代碼。

1. 連接過程及錯(cuò)誤處理概述

在使用 C 語言連接 MySQL 數(shù)據(jù)庫(kù)時(shí),主要使用 mysql_init() 函數(shù)初始化 MySQL 連接對(duì)象,然后使用 mysql_real_connect() 函數(shù)嘗試建立與數(shù)據(jù)庫(kù)的連接。這兩個(gè)函數(shù)都可能出現(xiàn)錯(cuò)誤,需要進(jìn)行相應(yīng)的錯(cuò)誤處理。

2. 具體錯(cuò)誤處理方法

2.1 mysql_init() 函數(shù)錯(cuò)誤處理

mysql_init() 函數(shù)用于初始化一個(gè) MySQL 連接對(duì)象,如果初始化失敗,會(huì)返回 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;
    }
    // 后續(xù)連接操作
    // ...
    mysql_close(conn);
    return 0;
}

在上述代碼中,如果 mysql_init() 返回 NULL,說明內(nèi)存分配失敗,程序會(huì)輸出錯(cuò)誤信息并退出。

2.2 mysql_real_connect() 函數(shù)錯(cuò)誤處理

mysql_real_connect() 函數(shù)用于建立與 MySQL 數(shù)據(jù)庫(kù)的連接,如果連接失敗,會(huì)返回 NULL。可以使用 mysql_error() 函數(shù)獲取具體的錯(cuò)誤信息。

#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,說明連接失敗,程序會(huì)使用 mysql_error() 函數(shù)獲取錯(cuò)誤信息并輸出,然后關(guān)閉連接并退出。

2.3 常見錯(cuò)誤及處理建議

  • 網(wǎng)絡(luò)問題:如果錯(cuò)誤信息提示無法連接到數(shù)據(jù)庫(kù)服務(wù)器,可能是網(wǎng)絡(luò)問題??梢詸z查數(shù)據(jù)庫(kù)服務(wù)器的 IP 地址和端口號(hào)是否正確,以及網(wǎng)絡(luò)是否正常。
  • 用戶名或密碼錯(cuò)誤:如果錯(cuò)誤信息提示認(rèn)證失敗,可能是用戶名或密碼錯(cuò)誤??梢詸z查用戶名和密碼是否正確。
  • 數(shù)據(jù)庫(kù)不存在:如果錯(cuò)誤信息提示數(shù)據(jù)庫(kù)不存在,可能是指定的數(shù)據(jù)庫(kù)名錯(cuò)誤。可以檢查數(shù)據(jù)庫(kù)名是否正確。

3. 更完善的錯(cuò)誤處理示例

以下是一個(gè)更完善的示例,包含了重試機(jī)制和詳細(xì)的錯(cuò)誤處理:

#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");
            // 執(zhí)行數(shù)據(jù)庫(kù)操作
            // ...
            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) {
            // 等待一段時(shí)間后重試
            sleep(2);
        }
    }

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

在上述代碼中,使用了一個(gè)重試機(jī)制,當(dāng)連接失敗時(shí),會(huì)嘗試重新連接,最多重試 MAX_RETRIES 次,每次重試之間等待 2 秒。如果多次重試后仍然失敗,程序會(huì)輸出錯(cuò)誤信息并退出。

通過以上方法,可以在 C 語言中有效地處理 MySQL 數(shù)據(jù)庫(kù)連接錯(cuò)誤,提高程序的健壯性。

如何在C語言中優(yōu)化MySQL數(shù)據(jù)庫(kù)操作的性能?

在 C 語言中優(yōu)化 MySQL 數(shù)據(jù)庫(kù)操作的性能可以從多個(gè)方面入手,下面將從數(shù)據(jù)庫(kù)連接管理、SQL 語句優(yōu)化、數(shù)據(jù)處理與傳輸優(yōu)化以及使用預(yù)處理語句等方面詳細(xì)介紹:

1. 數(shù)據(jù)庫(kù)連接管理

1.1 減少連接建立與關(guān)閉次數(shù)

頻繁地建立和關(guān)閉數(shù)據(jù)庫(kù)連接會(huì)帶來較大的開銷,因此應(yīng)盡量復(fù)用已有的連接??梢圆捎眠B接池的思想,在程序啟動(dòng)時(shí)建立一定數(shù)量的數(shù)據(jù)庫(kù)連接,后續(xù)操作從連接池中獲取連接,使用完畢后歸還連接,而不是每次操作都重新建立連接。

以下是一個(gè)簡(jiǎn)單的連接復(fù)用示例:

#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();
    // 執(zhí)行多次數(shù)據(jù)庫(kù)操作
    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 合理設(shè)置連接超時(shí)時(shí)間

mysql_real_connect 函數(shù)中可以設(shè)置連接超時(shí)時(shí)間,避免長(zhǎng)時(shí)間等待無響應(yīng)的連接請(qǐng)求。

MYSQL *conn = mysql_init(NULL);
if (conn != NULL) {
    mysql_options(conn, MYSQL_OPT_CONNECT_TIMEOUT, &(unsigned int){5}); // 設(shè)置連接超時(shí)時(shí)間為 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 語句優(yōu)化

2.1 避免使用 SELECT *

只選擇需要的列,減少數(shù)據(jù)傳輸量和數(shù)據(jù)庫(kù)處理開銷。例如:

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 合理使用索引

在數(shù)據(jù)庫(kù)表中為經(jīng)常用于查詢條件、排序和連接的列創(chuàng)建索引,能顯著提高查詢速度。在 C 語言代碼中,確保 SQL 查詢語句能夠利用這些索引。例如,如果 your_table 表的 column1 列上有索引,查詢時(shí)使用該列作為條件:

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 批量操作

對(duì)于插入、更新和刪除操作,盡量使用批量操作。例如,批量插入數(shù)據(jù):

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. 數(shù)據(jù)處理與傳輸優(yōu)化

3.1 減少不必要的數(shù)據(jù)傳輸

在查詢數(shù)據(jù)時(shí),根據(jù)實(shí)際需求進(jìn)行過濾和排序,避免將大量不必要的數(shù)據(jù)從數(shù)據(jù)庫(kù)傳輸?shù)綉?yīng)用程序。例如,使用 LIMIT 關(guān)鍵字限制返回的記錄數(shù):

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 優(yōu)化數(shù)據(jù)類型

在數(shù)據(jù)庫(kù)表設(shè)計(jì)時(shí),選擇合適的數(shù)據(jù)類型,避免使用過大的數(shù)據(jù)類型,以減少數(shù)據(jù)存儲(chǔ)和傳輸?shù)拈_銷。在 C 語言中,正確處理不同的數(shù)據(jù)類型,避免數(shù)據(jù)類型轉(zhuǎn)換帶來的性能損失。

4. 使用預(yù)處理語句

預(yù)處理語句可以減少 SQL 語句的解析和編譯次數(shù),提高多次執(zhí)行相同結(jié)構(gòu) SQL 語句的性能。以下是一個(gè)使用預(yù)處理語句插入數(shù)據(jù)的示例:

#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 語言中有效地優(yōu)化 MySQL 數(shù)據(jù)庫(kù)操作的性能。

最后

以上是 V 哥整理的在 C 語言開發(fā)中,操作 MySQL 數(shù)據(jù)庫(kù)的案例講解,希望可以幫助大家在學(xué)習(xí) C 語言時(shí)能夠快速上手,關(guān)注威哥愛編程,全棧開發(fā)就你行。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容