Linux程序设计——MySQL

“ Just do one thing do it well! ”

两个最著名的开源 RDBMS 应用软件是 PostgreSQL MySQL PostgreSQL 能在任何情况下免费使用。 MySQL 在某些情况下需要收取许可费用。本书专注于 MySQL ,《 Linux 高级程序设计》对 PostgreSQL 有所涉及,同时你可以在 www.postgresql.org 上找到更多详细资料。

 

安装 MySQL

一般情况下,在你安装的 Linux 套件中会有 MySQL 软件包。当你发现系统上没有安装 MySQL 时你就需要自己去手动安装了。安装方法一般分为两种: rpm 软件包分发和源代码分发。对于如何使用 rpm 二进制软件分发方式安装 MySQL ,网上有篇 介绍了在 RedHat 9 上的详细安装步骤;对于源代码分发方式,你可以参照源代码目录中 INSTALL_BINARY 文件。

MySQL 的安装过程中,安装脚本会为你自动创建一个初始数据库。同样,你也能得到一个用于启动和停止服务器的 init.d 脚本(通常在 /etc/rc.d/init.d 目录中) mysqld mysql 。通常情况下,在特定 Linux 发行版上查找数据库文件最简单的方法就是,在 init.d 目录中找到这个脚本并查看它的内容。标准路径和定义位于脚本的开头,你可以很容易地看到文件都被放在哪里了。

你也可以使用 chkconfig 命令来设置 MySQL 服务器的运行方式。该命令提供了一种更简单的方式来设置一个服务的运行级别。比如说,为了设置 MySQL 服务器在运行级别 3 4 上运行,可以按下面命令设置:

[billstone@ubuntu ~]$ chkconfig --add mysql        

// 首先将 mysql 添加为 chkconfig 管理的服务

[billstone@ubuntu ~]$ chkconfig --level 34 mysql on

                        // 在级别 3 4 上将 mysql 服务设置为开启状态( on

[billstone@ubuntu ~]$ chkconfig --level 01256 mysql off

                        // 在其他级别上将 mysql 服务设置为关闭状态( off

安装之后,可以以 root 身份使用 /etc/rc.d/init.d/mysql start 命令来手动启动服务器。 MySQL 在安装过程中还会创建用户 mysql ,在默认情况下, MySQL 服务器进程将以此用户的身份来运行。

MySQL 安装完成后,你可以使用下面的命令进入控制台

[billstone@ubuntu ~]$ mysql -u root mysql

在控制台上,你可以输入 /s 获得关于 MySQL 服务器的信息;当然你也可以使用 mysqladmin 命令来查看服务器的信息。

[billstone@ubuntu ~]$ mysqladmin -u root version

注意 MySQL root 用户和系统的 root 用户(超级用户)没有任何关联。对于 Linux 系统来说,除非绝对需要,否则使用 root 账号来登录 MySQL 是一个不好的习惯,所以你应该为日常使用添加一个普通用户。

 

管理 MySQL

MySQL 有一系列有用的工具程序来完成管理工作。

myisamchk 命令:用来检查和修复使用默认 MYISAM 表格格式的任何数据表格, MYISAM 表格格式由 MySQL 自身支持。

mysql 命令:这是 MySQL 主要的也是唯一完全交互式的命令行工具。当然你也可以用重定向方式读入 sql 文件以非交互式模式来运行 sql 命令:

[billstone@ubuntu ~]$ mysql -u rick –p bar foo < sqlcommands.sql

mysqladmin 命令:可以快速进行 MySQL 数据库管理。可以完成创建数据库、删除数据库、更改密码和查看状态等操作。

mysqldump 命令:可以以 SQL 命令集的形式把部分或整个数据库导出到一个单独文件中;同时该文件也能被重新导入 MySQL 或其他的 SQL RDBMS

mysqlimport 命令:与 mysqldump 对应的一个工具。

如果你是 MySQL 管理员,就必须维护用户信息。从 MySQL 3.22 开始,可以在 MySQL 控制台中使用 grant revoke 命令管理用户。详细情况请参照 MySQL 用户手册。

提示 MySQL 有一个叫做 MySQL GUI 的图形工具。如果你实在不喜欢文本方式下的操作,可以选择使用这个图形工具。

 

使用 C 语言访问 MySQL

C 语言提供了一系列 mysql 例程来完成对 mysql 数据库的操作,下面是一个典型的连接例程:

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

 

#include "mysql.h"

 

int main()

{

        MYSQL * pConn;

 

        pConn = mysql_init(NULL);

        assert(pConn != NULL);

 

        if(mysql_real_connect(pConn, "localhost", "rick1", "123", "foo", 0, NULL, 0))

                printf("Connection success!/n");

        else

                printf("Connection fail!/n");

 

        mysql_close(pConn);

 

        return 0;

}

在编译上面程序之前,需要在 MySQL 服务器上创建一个新的数据库 foo ,并且创建用户 rick1 ,在 MySQL 客户端上命令如下

mysql > grant ALL on foo.* to rick1@localhost identified by “123”

要使用 C 语言连接 MySQL 数据库,首先调用 mysql_init 函数初始化连接句柄,如果出错,返回 NULL ;调用 mysql_read_connect 创建实际连接,如果连接失败,返回 NULL

当完成连接后,通常在程序正常退出前,需要调用 mysql_close 关闭连接。

在上面的例程中,我们使用了 assert 断言来确保 mysql 接口调用后的有效性。实际上,为了获得更多的错误信息,我们应该使用 mysql_errno mysql_error 函数。

当编译该例程时,你很有可能需要添加头文件路径和库文件路径,并且需要指定链接的库模块 mysqlclient 。在某些系统上,你可能还需要使用 -lz 选项来链接压缩库。

注意 :当运行该例程时,一定要保证链接库文件 libmysqlclient.so.16 在有效的 LIB 路径(比如 /usr/lib 路径)上。

使用 C 语言接口操作 MySQL 数据库,实际上就是执行 sql 语句。实际编程中,我们使用 mysql_query 或者 mysql_real_query 执行 sql 语句。要获取 sql 语句的执行结果,我们使用 mysql_store_result 或者 mysql_use_result 函数,其中,前者一次性提取所有数据并将其存储在 MYSQL_RES 结构中,而后者则一次提取一行数据,同样存储在 MYSQL_RES 结构中。调用 mysql_num_rows 函数将得到结果集中的行数。在得到 MYSQL_RES 结构后,则循环调用 mysql_fetch_row 获取一行执行结果保存为 MYSQL_ROW 结构,要想提取列数据,只需对 MYSQL_ROW 结构进行下标操作,下面是一个典型例程:

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

 

#include "mysql.h"

 

MYSQL *pConn;

MYSQL_RES *res_ptr;      // 执行结果集

MYSQL_ROW sqlrow;      // 从执行结果集中获取的一行结果

 

void display_row(){

        unsigned int count;

 

        count = 0;

         while(count<mysql_field_count(pConn)){

                printf("%s ", sqlrow[count]);   // 从一行执行结果中读出列数据

                count++;

        }

        printf("/n");

}

 

int main()

{

        int res;

 

        pConn = mysql_init(NULL);

        assert(pConn != NULL);

 

        if(mysql_real_connect(pConn, "localhost", "rick1", "123", "foo", 0, NULL, 0)){

                printf("Connection success!/n");

                res = mysql_query(pConn, "select * from children"); // 执行 sql 语句

                if(!res){

                         res_ptr = mysql_store_result(pConn);  // 获取执行结果集

                        if(res_ptr){

                                printf("Get %lu rows/n", (unsigned long)mysql_num_rows(res_ptr));

                                while((sqlrow = mysql_fetch_row(res_ptr))){  // 从执行结果读取一行执行结果

                                        printf("Fetching data .../n");

                                        display_row();

                                }

                        }

                        mysql_free_result(res_ptr);   // 释放执行结果集

                }

                else

                        printf("Select error %s!/n", mysql_error(pConn));

        }

        else

                printf("Connection fail!/n");

 

        mysql_close(pConn);

 

        return 0;

}

在执行上述例程前,需要在 foo 数据库中完成 children 表的创建和数据插入操作。你可以选择直接在 MySQL 控制台上执行 sql 语句,也可以执行存储了 sql 语句的文件。定义如下,你可以多写入几行数据

create table children(

        childno int(11) not null auto_increment,

        fname varchar(30),

        age int(11),

        primary key (childno)

);

 

insert into children values(1, 'Jenny', 17);

insert into children values(2, 'Andrew', 13);

 

详细的 MySQL 编程接口可以自行查看手册。本章最后展示了 CD 唱片应用程序的完整代码。它详细地描述了如何设计 MySQL 数据库以及使用 C 语言接口来完成数据的存储和访问,为我们自己设计使用 MySQL 数据库带来了很大的帮助。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值