《Linux高并发服务器笔记——第六章、自我补充》

《Linux高并发服务器笔记——第六章、自我补充》

  • 一、数据库
    • 1.数据库的下载,配置和命令
      • ①安装MySQL
      • ②配置MySQL
      • ③创建数据库和用户
    • 2.数据库函数的介绍
    • 3.代码实现

一、数据库

1.数据库的下载,配置和命令

①安装MySQL

  • 在Ubuntu和Debian系统上,可以使用以下命令来安装MySQL:
sudo apt-get update
sudo apt-get install mysql-server
  • 在CentOS和Fedora系统上,可以使用以下命令来安装MySQL:
sudo yum install mysql-server
sudo systemctl start mysqld

②配置MySQL

  • 安装完成后,你需要进行一些配置。首先,你需要设置MySQL的root用户的密码:
sudo mysql_secure_installation
  • 然后,你需要编辑MySQL的配置文件:
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
  • 在mysqld选项的末尾添加以下行,以便MySQL可以使用UTF-8编码:
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
  • 接下来,你需要重新启动MySQL服务:
sudo service mysql start
sudo service mysql restart
  • 查看数据库状态
sudo service mysql status
  • 关闭数据库服务
sudo service mysql stop

③创建数据库和用户

  • 现在,你可以使用MySQL命令行客户端来创建数据库和用户。假设你的数据库名为example,用户名为user,密码为password:
mysql -u root -p
CREATE DATABASE example;
CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON example.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
  • 现在,你可以用新的用户登录并使用数据库了:
mysql -u user -p
USE example;

2.数据库函数的介绍

#include 

MYSQL *mysql_init(MYSQL *mysql);
    功能:为 MYSQL 结构体分配内存
    参数:
        - mysql:一个 MYSQL 结构体,中间有很多字段
    返回值:m
        - 成功:返回一个指向 MYSQL 的指针
        - 失败:NULL


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 client_flag);
    功能:建立与 MySQL 数据库服务器连接的函数
    参数:
        - mysql:MYSQL结构体的指针,调用函数前必须先调用 mysql_init() 函数进行初始化
        - host:主机名或者 ip 地址,NULL 表示本地连接
        - uesr:连接 MySQL 数据库的用户名
        - passwd:连接 MySQL 数据库的密码
        - db:要连接的数据库名。NULL 表示不指定默认数据库
        - port:MySQL 数据库服务器的端口号
        - unix_socket:用于本地连接的 Unix 套接字文件路径, 一般设置为 NULL
        - client_flag:客户端连接选项,例如设置字符集、启用压缩,可以设置 0
    返回值:
        - 成功:返回一个MYSQL结构体的指针
        - 失败:返回NULL


int mysql_query(MYSQL *mysql, const char *query);
    功能:该函数用于执行一条 MySQL 查询语句
    参数:
        - mysql:通过 mysql_init() 函数初始化好的 MySQL 连接对象
        - query:即待执行的SQL查询语句
    返回值:
        - 成功:返回 0
        - 失败:返回非 0


MYSQL_RES *mysql_store_result(MYSQL *mysql);
    功能:从 MySQL 服务器上检索结果集并将其存储在客户端内存中
    参数:
        - mysql:过 mysql_init() 函数初始化好的 MySQL 连接对象
    返回值:
        - 成功:函数将返回一个MYSQL_RES类型的结构体指针,指向存储结果集的内存块
        - 失败:返回 NULL


unsigned int mysql_num_fields(MYSQL_RES *result);
    功能:用于获取结果集中的字段数(列数)
    参数:
        - result:一个 MYSQL_RES 类型的结构体指针,指向存储结果集
    返回值:
        - 成功:返回结果集中的字段数(列数)
        - 失败:-1



MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
    功能:用于逐行获取结果集中的数据
    参数:
        - result:一个MYSQL_RES类型的结构体指针,指向存储结果集
    返回值:
        - 成功:如果还有更多的行可供获取,该函数将返回一个 MYSQL_ROW 类型的结构体指针,
                指向下一行数据, 多使用 while 获取实现
        - 失败:返回 NULL


void mysql_free_result(MYSQL_RES *result);
    功能:用于释放结果集的内存块
    参数:
        - result:一个 MYSQL_RES 类型的结构体指针,指向存储结果集的内存块


void mysql_close(MYSQL *mysql);
    功能:用于关闭与MySQL服务器的连接
    参数:
        - mysql:一个 MYSQL 类型的结构体指针

3.代码实现

/*
    #include 

    MYSQL *mysql_init(MYSQL *mysql);
        功能:为 MYSQL 结构体分配内存
        参数:
            - mysql:一个 MYSQL 结构体,中间有很多字段
        返回值:m
            - 成功:返回一个指向 MYSQL 的指针
            - 失败:NULL

    
    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 client_flag);
        功能:建立与 MySQL 数据库服务器连接的函数
        参数:
            - mysql:MYSQL结构体的指针,调用函数前必须先调用 mysql_init() 函数进行初始化
            - host:主机名或者 ip 地址,NULL 表示本地连接
            - uesr:连接 MySQL 数据库的用户名
            - passwd:连接 MySQL 数据库的密码
            - db:要连接的数据库名。NULL 表示不指定默认数据库
            - port:MySQL 数据库服务器的端口号
            - unix_socket:用于本地连接的 Unix 套接字文件路径, 一般设置为 NULL
            - client_flag:客户端连接选项,例如设置字符集、启用压缩,可以设置 0
        返回值:
            - 成功:返回一个MYSQL结构体的指针
            - 失败:返回NULL


    int mysql_query(MYSQL *mysql, const char *query);
        功能:该函数用于执行一条 MySQL 查询语句
        参数:
            - mysql:通过 mysql_init() 函数初始化好的 MySQL 连接对象
            - query:即待执行的SQL查询语句
        返回值:
            - 成功:返回 0
            - 失败:返回非 0

    
    MYSQL_RES *mysql_store_result(MYSQL *mysql);
        功能:从 MySQL 服务器上检索结果集并将其存储在客户端内存中
        参数:
            - mysql:过 mysql_init() 函数初始化好的 MySQL 连接对象
        返回值:
            - 成功:函数将返回一个MYSQL_RES类型的结构体指针,指向存储结果集的内存块
            - 失败:返回 NULL


    unsigned int mysql_num_fields(MYSQL_RES *result);
        功能:用于获取结果集中的字段数(列数)
        参数:
            - result:一个 MYSQL_RES 类型的结构体指针,指向存储结果集
        返回值:
            - 成功:返回结果集中的字段数(列数)
            - 失败:-1

    

    MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
        功能:用于逐行获取结果集中的数据
        参数:
            - result:一个MYSQL_RES类型的结构体指针,指向存储结果集
        返回值:
            - 成功:如果还有更多的行可供获取,该函数将返回一个 MYSQL_ROW 类型的结构体指针,
                    指向下一行数据, 多使用 while 获取实现
            - 失败:返回 NULL
    

    void mysql_free_result(MYSQL_RES *result);
        功能:用于释放结果集的内存块
        参数:
            - result:一个 MYSQL_RES 类型的结构体指针,指向存储结果集的内存块

    
    void mysql_close(MYSQL *mysql);
        功能:用于关闭与MySQL服务器的连接
        参数:
            - mysql:一个 MYSQL 类型的结构体指针



*/

#include 
#include 

using namespace std;

int main()
{
    MYSQL * mysql = nullptr;
    // 初始化数据库
    mysql = mysql_init(mysql);
    if (mysql == nullptr)
    {
        cout << "mysql_init : " << mysql_error(mysql) << endl;
        return 1;
    }

    // 连接数据库
    //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 client_flag);
    const char * host = "localhost";
    const char * uesr = "user";
    const char * passwd = "passwd";
    const char * dataBaseName = "mydatabase";
    
    if (mysql_real_connect(mysql, host, uesr, passwd, dataBaseName, 3306, nullptr, 0) == nullptr)
    {
        cout << "mysql_real_connect : " << mysql_error(mysql) << endl;
        return 1;
    }

    for (int i = 0; i <= 10; i ++ )
    {
        string s = "insert into users (id, username) values(";
        s += to_string(i);
        s += ", 'name";
        s += to_string(i);
        s.push_back('\'');
        s.push_back(')');
        cout << s << endl;
        mysql_query(mysql, s.c_str());
    }

    // 查询表内容
    if (mysql_query(mysql, "select * from users") != 0)
    {
        cout << "mysql_query : " << mysql_error(mysql) << endl;
        return 1;
    }

    // MYSQL_RES *mysql_store_result(MYSQL *mysql);
    // 获取查询结果
    MYSQL_RES * result = mysql_store_result(mysql);
    if (result == nullptr)
    {
        cout << "mysql_store_result : " << mysql_error(mysql) << endl;
        return 1;
    }
    int rowNum = mysql_num_fields(result);
    cout << "列数: " << rowNum << endl;


    // 读取每一行数据
    MYSQL_ROW row;
    while ((row = mysql_fetch_row(result)) != nullptr)
    {
        for (int i = 0; i < rowNum; i ++ )
        {
            cout << (row[i] == nullptr ? "NULL" : row[i]) << " ";
        }
        cout << endl;
    }

    mysql_free_result(result);
    mysql_close(mysql);

    return 0;
}
  • 结果
insert into users (id, username) values(0, 'name0')
insert into users (id, username) values(1, 'name1')
insert into users (id, username) values(2, 'name2')
insert into users (id, username) values(3, 'name3')
insert into users (id, username) values(4, 'name4')
insert into users (id, username) values(5, 'name5')
insert into users (id, username) values(6, 'name6')
insert into users (id, username) values(7, 'name7')
insert into users (id, username) values(8, 'name8')
insert into users (id, username) values(9, 'name9')
insert into users (id, username) values(10, 'name10')
列数: 4
0 name0 NULL NULL 
1 name1 NULL NULL 
2 name2 NULL NULL 
3 name3 NULL NULL 
4 name4 NULL NULL 
5 name5 NULL NULL 
6 name6 NULL NULL 
7 name7 NULL NULL 
8 name8 NULL NULL 
9 name9 NULL NULL 
10 name10 NULL NULL 

你可能感兴趣的:(服务器,linux,笔记)